模拟斗地主,出牌有一下规则,1张,1对,3张,3带1,3带2,炸弹(包括两个猫),4带2,这写规则,没有其他的,然后给你两幅牌,只要第一个人出了一次牌对方管不上,那么或者第一个人一次把牌都出光了,就算胜利,否则第一个人失败,记住,只出一次牌。
思路:
把所有的状态都模拟,每次都找出当前状态的最大值,如果对方管不上,那么就赢了,其他的就是注意点细节,比如大猫和小猫,还有就是炸弹什么的,今天做了一下午这个题目,敲了很多便都wa了,后来查出来竟然是自己不了解规则,我之前一直以为4带2必须用4带2去管,不能炸,结果今天问了他们才知道,4带2已经不是炸弹了,可以直接随便拿一个炸弹炸了,哎!斗地主都不会玩,颜面何存啊!
#include<stdio.h> #include<string.h> int k1[500] ,k2[500]; int pai[20]; char str1[25] ,str2[25]; void ini() { pai[1] = 'Y' ,pai[2] = 'X' ,pai[3] = '2' ,pai[4] = 'A' ,pai[5] = 'K'; pai[6] = 'Q' ,pai[7] = 'J' ,pai[8] = 'T' ,pai[9] = '9' ,pai[10] = '8'; pai[11] = '7' ,pai[12] = '6' ,pai[13] = '5' ,pai[14] = '4' ,pai[15] = '3'; } int main () { ini(); int t ,l1 ,l2 ,ok ,A ,XY ,i ,j ,Z; scanf("%d" ,&t); while(t--) { scanf("%s" ,str1) ,scanf("%s" ,str2); l1 = strlen(str1) ,l2 = strlen(str2); memset(k1 ,0 ,sizeof(k1)); memset(k2 ,0 ,sizeof(k2)); for(i = 0 ;i < l1 ;i ++) k1[str1[i]] ++; for(i = 0 ;i < l2 ;i ++) k2[str2[i]] ++; if(k1['X'] && k1['Y']) { puts("Yes"); continue; } k2['X'] && k2['Y'] ? XY = Z = 1 : XY = 0; ok = Z = A = 0; for(i = 1 ;i <= 15 ;i ++) if(k2[pai[i]] >= 4) Z = 1; // 1 for(i = 1 ;i <= 15 ;i ++) { if(k1[pai[i]] >= 1) { if(l1 == 1) A = 1; int tmp = 0; for(j = 1 ;j < i ;j ++) if(k2[pai[j]] >= 1) tmp = 1; if(!tmp && !Z) ok = 1; break; } } // 2 for(i = 1 ;i <= 15 ;i ++) { if(k1[pai[i]] >= 2) { if(l1 == 2) A = 1; int tmp = 0; for(j = 1 ;j < i ;j ++) if(k2[pai[j]] >= 2) tmp = 1; if(!tmp && !Z) ok = 1; break; } } //3 for(i = 1 ;i <= 15 ;i ++) { if(k1[pai[i]] >= 3) { if(l1 == 3) A = 1; int tmp = 0; for(j = 1 ;j < i ;j ++) if(k2[pai[j]] >= 3) tmp = 1; if(!tmp && !Z) ok = 1; break; } } //3-1 for(i = 1 ;i <= 15 ;i ++) { if(k1[pai[i]] >= 3 && l1 >= 4) { if(l1 == 4) A = 1; int tmp = 0; for(j = 1 ;j < i ;j ++) if(k2[pai[j]] >= 3 && l2 >= 4) tmp = 1; if(!tmp && !Z) ok = 1; break; } } //3-2 int tt1 = 0 ,tt2 = 0; for(i = 1 ;i <= 15 ;i ++) { if(k1[pai[i]] >= 2) tt1 ++; if(k2[pai[i]] >= 2) tt2 ++; } for(i = 1 ;i <= 15 ;i ++) { if(k1[pai[i]] >= 3 && tt1 >= 2) { if(l1 == 5) A = 1; int tmp = 0; for(j = 1 ;j < i ;j ++) if(k2[pai[j]] >= 3 && tt2 >= 2) tmp = 1; if(!tmp && !Z) ok = 1; break; } } //4 for(i = 1 ;i <= 15 ;i ++) { if(k1[pai[i]] >= 4) { if(l1 == 4) A = 1; int tmp = 0; for(j = 1 ;j < i ;j ++) if(k2[pai[j]] >= 4) tmp = 1; if(!tmp) ok = 1; } } //4-2 for(i = 1 ;i <= 15 ;i ++) { if(k1[pai[i]] >= 4 && l1 >= 6) { if(l1 == 6) A = 1; int tmp = 0; for(j = 1 ;j < i ;j ++) if(k2[pai[j]] >= 4 && l2 >= 6) tmp = 1; if(!tmp && !Z) ok = 1; break; } } if(A) ok = 1; if(!A && XY) ok = 0; ok ? puts("Yes") : puts("No"); } return 0; }