问题 I: 斗地主

时间限制: 1 Sec  内存限制: 128 MB

题目描述

牛牛最近迷上了一种叫斗地主的扑克游戏。斗地主是一种使用黑桃、红心、梅花、方片的A到K加上大小王的共54张牌来进行的扑克牌游戏。在斗地主中,牌的大小关系根据牌的数码表示如下:3<4<5<6<7<8<9<10<J<Q<K<A<2<小王<大王,而花色并不对牌的大小产生影响。每一局游戏中,一副手牌由n张牌组成。游戏者每次可以根据规定的牌型进行出牌,首先打光自己的手牌一方取得游戏的胜利。现在,牛牛只想知道,对于自己的若干组手牌,分别最少需要多少次出牌可以将它们打光。请你帮他解决这个问题。需要注意的是,本题中游戏者每次可以出手的牌型与一般的斗地主相似而略有不同。具体规则如下:

输入

第一行包含用空格隔开的2个正整数T,N,表示手牌的组数以及每组手牌的张数。
接下来T组数据,每组数据N行,每行一个非负整数对Ai,Bi,表示一张牌,其中Ai表示牌的数码,Bi表示牌的花色,中间用空格隔开。特别的,我们用1来表示数码A,11表示数码J,12表示数码Q,13表示数码K;黑桃、红心、梅花、方片分别用1-4来表示;小王的表示方法为01,大王的表示方法为02。

输出

输共T行,每行一个整数,表示打光第T组手牌的最少次数。

样例输入:

1 8 7 4 8 4 9 1 10 4 11 1 5 1 1 4 1 1

样例输出:3

/**/
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cctype>
#include <iostream>
#include <algorithm>
#include <map>
#include <set>
#include <vector>
#include <string>
#include <stack>
#include <queue>typedef long long LL;
using namespace std;int t, n;
int num[20];
int ans;void dfs(int time){int num1 = 0, num2 = 0, num3 = 0, num4 = 0;//分别表示单牌需要几次,双牌.....for (int i = 2; i <= 15; i++){ // 统计单张牌和双牌对的数目if(num[i] == 1) num1++;if(num[i] == 2) num2++;//if(num[i] == 3) num3++;//if(num[i] == 4) num4++;}for (int i = 2; i <= 14; i++){//首先要尽量的让单牌少if(num[i] == 4){num4++;if(num1 >= 2){//4带2张不同的牌num1 -= 2;//num4++;}else if(num2 >= 2){//4带对双num2 -= 2;//num4++;}else if(num2 >= 1){//4带2张相同的牌num2 -= 1;}}}for (int i = 2; i <= 14; i++){//同上if(num[i] == 3){num3++;if(num1 >= 1){num1--;//num3++;}else if(num2 >= 1){num2--;//num3++;}}}ans = min(ans, num1 + num2 + num3 + num4 + time);//每次记录最小的答案for (int i = 3; i <= 10; i++){//单顺子int cnt = 0, j;for (j = i; j <= 14; j++){num[j]--;if(num[j] < 0) break;cnt++;if(cnt >= 5) dfs(time + 1);}if(j == 15) j--;//!! num[15]我记录的是大小王,但是顺子中不会有大小王,但是for循环会到15while(j >= i) num[j]++, j--;}for (int i = 3; i <= 12; i++){//双顺子int cnt = 0, j;for (j = i; j <= 14; j++){num[j] -= 2;if(num[j] < 0) break;cnt++;if(cnt >= 3) dfs(time + 1);//num[j] += 2;}if(j == 15) j--;while(j >= i) num[j] += 2, j--;}for (int i = 3; i <= 13; i++){//三顺子int cnt = 0, j;for (j = i; j <= 14; j++){num[j] -= 3;if(num[j] < 0) break;cnt++;if(cnt >= 2) dfs(time + 1);}if(j == 15) j--;while(j >= i) num[j] += 3, j--;}
}int main()
{//freopen("in.txt", "r", stdin);//freopen("out.txt", "w", stdout);scanf("%d %d", &t, &n);while(t--){int x, flw;ans = 0x3f3f3f3f;memset(num, 0, sizeof(num));for (int i = 1; i <= n; i++){scanf("%d %d", &x, &flw);if(x == 1){// A记录在后面14的位置即K的后面num[14]++;}else if(x == 0){//大小王我也放在了后面num[15]++;}else{num[x]++;}}dfs(0);printf("%d\n", ans);}return 0;
}
/**/

斗地主(dfs+模拟)相关推荐

  1. 736. Lisp 语法解析 : DFS 模拟题

    题目描述 这是 LeetCode 上的 736. Lisp 语法解析 ,难度为 困难. Tag : 「DFS」.「模拟」.「哈希表」 给你一个类似 Lisp 语句的字符串表达式 expression, ...

  2. 历届试题 核桃的数量(3个数的最小公倍数),翻硬币(贪心),买不到的数目(在范围内暴力,找范围,最小公倍数是上界,最小的数是下界),兰顿蚂蚁(dfs,模拟)

    历届试题 核桃的数量 问题描述 小张是软件项目经理,他带领3个开发组.工期紧,今天都在加班呢.为鼓舞士气,小张打算给每个组发一袋核桃(据传言能补脑).他的要求是: 各组的核桃数量必须相同 各组内必须能 ...

  3. HDU4801 转魔方、DFS模拟

    题目 HDU 4801 给出一个两阶魔方的初始形态,一次可以将一个面转动90° 求在N(1<=N<=7)步内最多能拼成几个面. 题解 由于是两阶魔方,左边UP等于右边DOWN,因此共有6种 ...

  4. python实现单机斗地主_python模拟斗地主发牌

    本文实例为大家分享了python模拟斗地主发牌的具体代码,供大家参考,具体内容如下 题目:趣味百题之斗地主 扑克牌是一种非常大众化的游戏,在计算机中有很多与扑克牌有关的游戏.例如,在Windows操作 ...

  5. python实现单机斗地主_python模拟实现斗地主发牌

    题目:趣味百题之斗地主 扑克牌是一种非常大众化的游戏,在计算机中有很多与扑克牌有关的游戏.例如,在Windows操作系统下自带的纸牌.红心大战等.在扑克牌类的游戏中,往往都需要执行洗牌操作,就是将一副 ...

  6. hdu 1298 字典树 + DFS (模拟T9文本输入)

    题意:       给你一些按键顺序,让你输出每一步中概率最大的那个单词,这里的概率计算方 法好好看看别弄错了,一开始就是因为弄错了,各种wa,比如 abc 1 ,ab 1,那么 ab 的概率就是2 ...

  7. UVALive 6884 GREAT + SWERC = PORTO dfs模拟

    题目连接: https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show ...

  8. 翻转棋 dfs+模拟

    题目描述 农夫约翰知道,聪明的奶牛可以产更多的牛奶.他为奶牛设计了一种智力游戏,名叫翻转棋.翻转棋可以分成M × N (1 ≤ M, N ≤ 15)个格子,每个格子有两种颜色,一面是黑的,一面是白的. ...

  9. URAL 2013 Neither shaken nor stirred dfs 模拟

    题目链接:点击打开链接 题意: 给定n个点的有向图: 下面n行,第一个数字表示点权,后面一个数字m表示有m条边. 起点是1. 对于每个点,输出2个值表示前驱点权1和该点点权2. 1.若有多条路径到达该 ...

最新文章

  1. 阿里配管专家解读:如何最优成本搭建非标准的iOS构建集群
  2. 使用 OAuth2-Server-php 搭建 OAuth2 Server
  3. 如何在redhat8里使用gcc命令_如何使用who命令检查用户登录信息
  4. 1.the linux device model--kobject kset学习笔记
  5. php class variable,解决关于PHP“Undefined variable”变量未定义
  6. 通过NodeJS自动生成的MySQL的REST风格API
  7. DataBase 之 数据库设计六大范式
  8. 201521123033《Java程序设计》第3周学习总结
  9. MNIST数据集下载 —— 数据集提供百度网盘下载地址
  10. 北京双线机房的优缺点分析
  11. 通讯录管理系统(C++)
  12. android 获取build,分析,读取 android build.prop
  13. jena 查询 java_使用SPARQL和Jena查询DBpedia
  14. 苹果原壁纸高清_手机壁纸巨型神兽系列全面屏壁纸图片
  15. AVA Actions Dataset 详解
  16. 关于“网络安全”五点须知!
  17. 领域模型和领域对象的概念
  18. Chrome 浏览器以 58.09% 的市场占有率稳居世界第一
  19. showModalDialog兼容版
  20. Linux SPI子系统(3):SPI控制器驱动层

热门文章

  1. 重装系统后360驱动大师如何安装打印机驱动
  2. 用手机怎么把图片转换成PDF
  3. 大数据:70多个网站让你免费获取大数据存储库
  4. PE启动盘制作,解决An operating system wasn‘t found.
  5. Linux中进程的创建、进程的终止、进程的等待、进程的程序替换
  6. 【汇正财经】蓝筹股的类别
  7. 数据分析——【统计学】异常值检测
  8. web前端高级React - React从入门到进阶之初识React
  9. C++实现KMP(Knuth-Morris-Pratt)字符串匹配算法
  10. js dom操作实现雪花下落