现在的位置: 首页 > 综合 > 正文

HDU 4930 模拟题

2018年01月19日 ⁄ 综合 ⁄ 共 1632字 ⁄ 字号 评论关闭

额,这题当时我还觉得是博弈题。。。呵呵了就。题意以后一定要看清,不要盲目来。最近有点心急,或者有点懒散。

题目大意:斗地主,可以出单张,对子,三张,三带一,三带二(一定是对子),四带二,四张,王炸,威力递增。你先出牌,有两种情况可以获胜。

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;
}

抱歉!评论已关闭.