额,这题当时我还觉得是博弈题。。。呵呵了就。题意以后一定要看清,不要盲目来。最近有点心急,或者有点懒散。
题目大意:斗地主,可以出单张,对子,三张,三带一,三带二(一定是对子),四带二,四张,王炸,威力递增。你先出牌,有两种情况可以获胜。
1.你手中的牌先打完了。
2,.你手中的牌压住了别人。
当时看题的时候就没看到说手中的牌压住别人就算赢了,然后纠结了很久。。。当然看到了其实也不一定会做。
所以这时候思路就比较清晰了,第一,判断手中的牌是否能一次出完,否则,判断手中最大的牌是否能压住对手最大的牌。
先理一下思路,先记录手中牌的情况,然后记下牌型最大的那一个,再对三带一,三带二这样的特殊情况进行判断和记录,之后进行判断是否能一次出完,若不能,再判断手中最大的牌型。这里要记得特判一下王炸。
然后。。。不知道WA哪里了。哭。
#include <stdio.h>
#include <string.h>
int a[2];
char s[2][18];
int max[2][18];
int cmp[256],cnt[2][18],deux[2][3];
int get()
{
int i,j,k;
scanf("%s%s",s[0],s[1]);
a[0]=strlen(s[0]);
a[1]=strlen(s[1]);
for(i=0;i<2;i++)
for(j=0;j<a[i];j++)
{cnt[i][cmp[s[i][j]]]++;}//printf("**%d",cmp[s[i][j]]);}
// printf("***\n");
for(i=0;i<2;i++)
for(j=4;j>=0;j--)
for(k=17;k>=3;k--)
if(cnt[i][k]>=j)
{
max[i][j]=k;
break;
}
// printf("****\n");
for(i=0;i<2;i++)
for(k=1;k<=2;k++)
for(j=17;j>=3;j--)
if(max[i][3]&&max[i][3]!=j&&cnt[i][j]>=k)
deux[i][k]=max[i][3];
//printf("*****\n");
if(max[0][3]&&a[0]==3) return 1;
if(deux[0][1]&&a[0]==4||deux[0][2]&&a[0]==5) return 1;
if(max[0][4]&&a[0]==6) return 1;
if(a[0]<5&&max[0][a[0]]) return 1;
// if(max[0][2]&&a[0]==2) return 1;
if(max[0][17]&&max[0][16]) return 1;
// if(max[0][4]&&a[0]==4) return 1;
if(max[1][4]>max[0][4]) return 0;
if(max[1][16]&&max[1][17]) return 0;
for(i=4;i>=0;i--)
if(max[0][i]&&max[0][i]>max[1][i]) return 1;
//printf("******\n");
return 0;
}
int main()
{
cmp['3']=3;
cmp['4']=4;
cmp['5']=5;
cmp['6']=6;
cmp['7']=7;
cmp['8']=8;
cmp['9']=9;
cmp['T']=10;
cmp['J']=11;
cmp['Q']=12;
cmp['K']=13;
cmp['A']=14;
cmp['2']=15;
cmp['X']=16;
cmp['Y']=17;
int t;
scanf("%d",&t);
while(t--)
{
memset(cnt,0,sizeof(cnt));
memset(deux,0,sizeof(deux));
memset(max,0,sizeof(max));
if(get()) printf("YES\n");
else printf("NO\n");
}
return 0;
}