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 }

时间: 2024-10-19 09:04:54

uva 131的相关文章

UVa 131 - The Psychic Poker Player

题目:手里有五张牌,桌上有一堆牌(五张),你可以弃掉手中的k张牌,然后从牌堆中取最上面的k个. 比较规则如下:(按优先级排序) 1.straight-flush:同花顺,牌面为T(10) - A,这里不论花色是否相同: 2.four-of-a-kind:四条,牌面有4个相同的值: 3.full-house:船牌,牌面有3个相同值,剩下2个也相同值: 4.flush:同花,五张牌的花色相同,不是同花顺: 5.straight:顺子,五张牌的值连续,A可以作为1也可以作为14: 6.three-of

uva 131 The Psychic Poker Player (暴力枚举)

uva 131 The Psychic Poker Player  The Psychic Poker Player  In 5-card draw poker, a player is dealt a hand of five cards (which may be looked at). The player may then discard between zero and five of his or her cards and have them replaced by the sam

UVa 131 有超能力的纸牌玩家

题意:题目描述太简单了,简直需要猜题目.看别人的题解也知道题目意思.大致意思是,手里五张牌,可以弃0~5张,然后从牌堆的5张中拿最上面的同等数量纸牌,使得value最大.value的评价真的是要猜...依次为: straight-flush 同花顺four-of-a-kind  炸弹full-house   满堂红 三张同点牌加上一对 flush 同花straight 顺子(注意A即可接2也可以接K)three-of-a-kind   三张相同的牌 two-pairs 两对对子 one-pair

[题解]UVa 12661 Funny Car Racing - spfa

很简单的一道最短路问题.分情况处理赛道的打开和关闭. Code 1 /** 2 * UVa 3 * Problem#12661 4 * Accepted 5 * Time:50ms 6 */ 7 #include<iostream> 8 #include<fstream> 9 #include<sstream> 10 #include<cstdio> 11 #include<cstdlib> 12 #include<cstring>

[题解]UVa 11082 Matrix Decompressing

开始眨眼一看怎么也不像是网络流的一道题,再怎么看也觉得像是搜索.不过虽然这道题数据范围很小,但也不至于搜索也是可以随随便便就可以过的.(不过这道题应该是special judge,因为一题可以多解而且题目中然而并没有什么要求,所以说可以考虑思考一下这道题有木有什么"套路"之类的通法) 比如说有这么一组数据 原矩阵 1 2 3 4 7 8 9 5 6 输入 3 3 6 25 45 14 28 45 然后将每一行的和写在每一列对应的行上(很明显有问题) 6 0 0 19 0 0 20 0

[uva] 10099 - The Tourist Guide

10099 - The Tourist Guide 题目页:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=1040 Mr.G.自己也算一个人……… 反映到代码里是127行 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 3

uva 10391 Compound Words (字符串-hash)

Problem E: Compound Words You are to find all the two-word compound words in a dictionary. A two-word compound word is a word in the dictionary that is theconcatenation of exactly two other words in the dictionary. Input Standard input consists of a

UVa 11888 Abnormal 89&#39;s

方法:Manacher Manacher算法在O(length) 时间内求出各个回文子串的长度.O(length) 时间检查时那一种情况. code: 1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 #include <iostream> 5 #include <string> 6 #include <vector> 7 #include <st

UVA 658 It&#39;s not a Bug, it&#39;s a Feature! (单源最短路,dijkstra+优先队列,变形,经典)

题意:有n个bug,有m个补丁,每个补丁有一定的要求(比如某个bug必须存在,某个必须不存在,某些无所谓等等),打完出来后bug还可能变多了呢.但是打补丁是需要时间的,每个补丁耗时不同,那么问题来了:要打多久才能无bug?(同1补丁可重复打) 分析: n<=20,那么用位来表示bug的话有220=100万多一点.不用建图了,图实在太大了,用位图又不好玩.那么直接用隐式图搜索(在任意点,只要满足转移条件,任何状态都能转). 但是有没有可能每个状态都要搜1次啊?那可能是100万*100万啊,这样出题