hdu4930 模拟斗地主

题意:
       模拟斗地主,出牌有一下规则,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;
}
         

原文地址:https://www.cnblogs.com/csnd/p/12062880.html