uva 131

题目大意:手上有5张牌, 堆上有5张牌, 现在要求舍弃手上的n(0<=n<=5)牌, 从堆的面上拿n张牌, 假设了你有特异功能, 可以知道堆上的5张牌从上到下是是什么, 要求最后得到的牌要面值最大, 一张牌由数字与花色组成。

straight-flush   同花顺:一手同花的五张牌 + 五张牌点数连续的顺子

four-of-a-kind    四张相同 的牌

full-house        满堂红:三张同点牌加上一对(此时存在2张不同点的牌)

flush        一手同花的五张牌

straight       顺子:五张牌点数连续的顺子

three-of-a-kind    三张相同的牌

two-pairs     两对对子(此时存在3张不同点的牌)

one-pair          一对对子

highest-card       上面的所有情况不符合

( 坑爹的一道题 , 注意A的俩个身份  既是A又是 1 。。。。。 )

  1 #include <stdio.h>
  2 #include <string.h>
  3 #include <stdlib.h>
  4 #include <ctype.h>
  5 #include <time.h>
  6 #include <math.h>
  7 char str[15][5];
  8 char sub[8][5];
  9 bool mark[10];
 10 int cur;
 11 
 12 char ch[15][25] = {
 13     "straight-flush",
 14     "four-of-a-kind",
 15     "full-house",
 16     "flush",
 17     "straight",
 18     "three-of-a-kind",
 19     "two-pairs",
 20     "one-pair",
 21     "highest-card"
 22 };
 23 
 24 bool Flush() //同花
 25 {
 26     char s = sub[0][1];
 27     for( int i = 1; i < 5; ++i )
 28         if( s != sub[i][1] )
 29             return false;
 30     return true;
 31 }
 32 
 33 bool Straight() //顺子
 34 {
 35     if( sub[0][0] == '2' )
 36     {
 37         for( int i = 1; i < 4; ++i )
 38             if( sub[i][0] != '2' + i )
 39                 return false;
 40         if( sub[4][0] == '>' || sub[4][0] == '6' )
 41             return true;
 42         return false;
 43     }
 44     for( int i = 0; i < 4; ++i )
 45         if( sub[i+1][0] != sub[i][0] + 1 )
 46             return false;
 47     return true;
 48 }
 49 
 50 int Kind() //相同
 51 {
 52     int num[7];
 53     memset( num, 0, sizeof( num ) );
 54     int t = 0;
 55     for( int i = 1; i < 5; ++i )
 56         if( sub[i][0] == sub[i-1][0] )
 57             ++num[t];
 58         else
 59             ++t;
 60     t = 0;
 61     int Max = 0;
 62     for( int i = 0; i <= 4; ++i )
 63         if( num[i] ) {
 64             if( Max < num[i] )
 65                 Max = num[i];
 66             ++t;
 67     }
 68     if( Max >= 3 )
 69         return 4;
 70     if( Max == 2 && t == 2 )
 71         return 5;
 72     if( Max == 2 )
 73         return 3;
 74     if( Max == 1 && t == 2 )
 75         return 2;
 76     if( Max == 1 )
 77         return 1;
 78     return 0;
 79 }
 80 
 81 void Sort()
 82 {
 83     for( int i = 1; i < 5; ++i )
 84         for( int j = 0; j < 5-i; ++j )
 85             if( sub[j][0] > sub[j+1][0] )
 86             {
 87                 char ss[5];
 88                 strcpy( ss, sub[j] );
 89                 strcpy( sub[j], sub[j+1] );
 90                 strcpy( sub[j+1], ss );
 91             }
 92 }
 93 
 94 int Search()
 95 {
 96     Sort();
 97     if( Flush() && Straight() )
 98         return 0;
 99     int k = Kind();
100     if( k == 4 )
101         return 1;
102     if( k == 5 )
103         return 2;
104     if( Flush() )
105         return 3;
106     if( Straight() )
107         return 4;
108     if( k == 3 )
109         return 5;
110     if( k == 2 )
111         return 6;
112     if( k == 1 )
113         return 7;
114     return 8;
115 }
116 
117 void dfs( int x )
118 {
119     if( x == 5 ) {
120         int y = 5;
121         for( int i = 0; i < 5; ++i )
122             if( mark[i] )
123                 strcpy( sub[i], str[i] );
124             else
125                 strcpy( sub[i], str[y++] );
126         int k = Search();
127         if( cur > k )
128             cur = k;
129         return;
130     }
131     mark[x] = 1;
132     dfs( x+1 );
133     mark[x] = 0;
134     dfs( x+1 );
135 }
136 
137 void Change( char x )
138 {
139     if( str[x][0] == 'T' )
140         str[x][0] = ':';
141     else if( str[x][0] == 'J' )
142         str[x][0] = ';';
143     else if( str[x][0] == 'Q' )
144         str[x][0] = '<';
145     else if( str[x][0] == 'K' )
146         str[x][0] = '=';
147     else if( str[x][0] == 'A' )
148         str[x][0] = '>';
149 }
150 
151 int main()
152 {
153     while( ~scanf( "%s", str[0] ) )
154     {
155         memset( sub, '\0', sizeof( sub ) );
156         memset( mark, 0, sizeof( mark ) );
157         printf( "Hand: %s", str[0] );
158         Change( 0 );
159         for( int i = 1; i < 10; ++i )
160         {
161             getchar();
162             scanf( "%s", str[i] );
163             if( i == 5 )
164                 printf( " Deck:" );
165             printf( " %s", str[i] );
166             Change( i );
167         }
168         cur = 8;
169         getchar();
170         dfs( 0 );
171         printf( " Best hand: %s\n", ch[cur] );
172     }
173     return 0;
174 }
View Code

 

转载于:https://www.cnblogs.com/ADAN1024225605/p/4045627.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值