UVa 131 有超能力的纸牌玩家
来源:互联网 发布:用阿里云gpu挖比特币 编辑:程序博客网 时间:2024/06/02 07:27
题意:题目描述太简单了,简直需要猜题目。看别人的题解也知道题目意思。大致意思是,手里五张牌,可以弃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 一对对子
highest-card 单张最大
思路:知道题目意思后就比较简单。枚举手里5张牌的所有子集,不够5张的,就从牌堆最上方拿来补足5张。然后用这5张来判断即可。由于这里只是5张,比较小,所以直接进行判断就可以了。之前想记录下5张中有几个5同、4同、3同、2同的,太麻烦了,直接依次从分值最大的开始判断即可。在得到5张牌之后,可以判断是否同色,排序后方便判断顺子以及对子等。Code:
#include<stdio.h>#include<stdlib.h>void solve();void subset(int *A, int cur);int process(int cur);int cmp_int(const void *_a, const void *_b);char besthd[][22]={"straight-flush","four-of-a-kind","full-house","flush", "straight","three-of-a-kind","two-pairs","one-pair","highest-card"};char cards[10][5];int value[10];int A[6];int min;int main(){ //freopen("131.in","r",stdin); //freopen("131.out","w",stdout); for(int i=0;i<10;++i) { if(scanf("%s",cards[i])!=1) break; if(i<9) continue; printf("Hand:"); for(int j=0;j<5;++j) printf(" %s",cards[j]); printf(" Deck:"); for(int j=5;j<10;++j) printf(" %s",cards[j]); printf(" Best hand: "); solve(); i=-1; }}void solve(){ for(int i=0;i<10;++i) { if(cards[i][0]=='T') value[i]=10; else if(cards[i][0]=='J') value[i]=11; else if(cards[i][0]=='Q') value[i]=12; else if(cards[i][0]=='K') value[i]=13; else if(cards[i][0]=='A') value[i]=1; else value[i]=cards[i][0]-'0'; } min=8; subset(A,0); printf("%s\n",besthd[min]);}void subset(int *A, int cur){ int temp=process(cur); min=temp<min?temp:min; int s=cur?A[cur-1]+1:0; for(int i=s;i<5;++i) { A[cur]=i; subset(A,cur+1); }}int process(int cur){ int num[5]; int ts=1;//同色 for(int i=0;i<cur;++i) { num[i]=value[A[i]]; if(cards[A[i]][1]!=cards[A[0]][1]) ts=0; } for(int i=cur;i<5;++i) { num[i]=value[5+i-cur];//是5,不是6 if(cards[5+i-cur][1]!=cards[A[0]][1]) ts=0; } qsort(num,5,sizeof(num[0]),cmp_int); int sz=1;//顺子 但1,10,11,12,13也是顺子 for(int i=0;i<4;++i) { if(i==0 && num[i]==1 && num[4]==13) continue; if(num[i]-num[i+1]!=-1) { sz=0; break;} } if(sz&&ts) return 0; if((num[0]==num[1] || num[3]==num[4]) && num[1]==num[2] && num[2]==num[3]) return 1; if(num[0]==num[1] && num[1]==num[2] && num[3]==num[4]) return 2; if(num[0]==num[1] && num[2]==num[3] && num[3]==num[4]) return 2; if(ts) return 3; if(sz) return 4; if(num[0]==num[1] && num[1]==num[2]) return 5; if(num[1]==num[2] && num[2]==num[3]) return 5; if(num[3]==num[4] && num[4]==num[5]) return 5; if(num[0]==num[1] && (num[2]==num[3]||num[3]==num[4])) return 6; if(num[1]==num[2] && num[3]==num[4]) return 6; if(num[0]==num[1] || num[1]==num[2] || num[2]==num[3] || num[3]==num[4]) return 7; else return 8;}int cmp_int(const void *_a, const void *_b){ return *(int*)_a - *(int*)_b; }Code2:
//非递归形式,即二进制法枚举子集 #include<stdio.h>#include<stdlib.h>void solve();void subset(int *A, int cur);int process(int cur);int cmp_int(const void *_a, const void *_b);char besthd[][22]={"straight-flush","four-of-a-kind","full-house","flush", "straight","three-of-a-kind","two-pairs","one-pair","highest-card"};char cards[10][5];int value[10];int A[6];int min;int main(){ freopen("131.in","r",stdin); freopen("131.out","w",stdout); for(int i=0;i<10;++i) { if(scanf("%s",cards[i])!=1) break; if(i<9) continue; printf("Hand:"); for(int j=0;j<5;++j) printf(" %s",cards[j]); printf(" Deck:"); for(int j=5;j<10;++j) printf(" %s",cards[j]); printf(" Best hand: "); solve(); i=-1; }}void solve(){ for(int i=0;i<10;++i) { if(cards[i][0]=='T') value[i]=10; else if(cards[i][0]=='J') value[i]=11; else if(cards[i][0]=='Q') value[i]=12; else if(cards[i][0]=='K') value[i]=13; else if(cards[i][0]=='A') value[i]=1; else value[i]=cards[i][0]-'0'; } min=8; for(int i=0;i<(1<<5);++i) { int cur=0; for(int j=0;j<5;++j) if(i & (1<<j)) { A[cur++]=j; } int temp=process(cur); min=temp<min?temp:min; } printf("%s\n",besthd[min]);}int process(int cur){ int num[5]; int ts=1;//同色 for(int i=0;i<cur;++i) { num[i]=value[A[i]]; if(cards[A[i]][1]!=cards[A[0]][1]) ts=0; } for(int i=cur;i<5;++i) { num[i]=value[5+i-cur];//是5,不是6 if(cards[5+i-cur][1]!=cards[A[0]][1]) ts=0; } qsort(num,5,sizeof(num[0]),cmp_int); int sz=1;//顺子 但1,10,11,12,13也是顺子 for(int i=0;i<4;++i) { if(i==0 && num[i]==1 && num[4]==13) continue; if(num[i]-num[i+1]!=-1) { sz=0; break;} } if(sz&&ts) return 0; if((num[0]==num[1] || num[3]==num[4]) && num[1]==num[2] && num[2]==num[3]) return 1; if(num[0]==num[1] && num[1]==num[2] && num[3]==num[4]) return 2; if(num[0]==num[1] && num[2]==num[3] && num[3]==num[4]) return 2; if(ts) return 3; if(sz) return 4; if(num[0]==num[1] && num[1]==num[2]) return 5; if(num[1]==num[2] && num[2]==num[3]) return 5; if(num[3]==num[4] && num[4]==num[5]) return 5; if(num[0]==num[1] && (num[2]==num[3]||num[3]==num[4])) return 6; if(num[1]==num[2] && num[3]==num[4]) return 6; if(num[0]==num[1] || num[1]==num[2] || num[2]==num[3] || num[3]==num[4]) return 7; else return 8;}int cmp_int(const void *_a, const void *_b){ return *(int*)_a - *(int*)_b; }
0 0
- UVa 131 有超能力的纸牌玩家
- uva 131 有超能力的纸牌玩家
- uva131-The Psychic Poker Player(有超能力的纸牌玩家)
- 全球十个有超能力的人
- 127UVa纸牌游戏
- UPC OJ 2678: 交换的超能力
- Eleusis Express:非常有创意的多人纸牌游戏
- 玩家和外挂程序的差别有多大?
- uva 11427 玩纸牌 概率
- Unreal教学(12)——增加玩家的能力(Enhancing Player Abilities)
- vim超能力
- 华罗庚谈超能力
- 如何发掘和放大程序员的“超能力”
- 【转载】我的超能力鼠标与键盘
- 俞敏洪:相信自己有改变命运的能力
- 简单的纸牌
- 纸牌位图的加载
- 纸牌显示的方向
- 浙大机试2007:EXCEL排序
- 为什么学习Object-C这么难?
- 关于java程序中的正则表达式的应用小解(1)
- jquery focus的用法
- Oracle BETWEEN 条件
- UVa 131 有超能力的纸牌玩家
- 穿透内网,连接动态ip,内网ip打洞-----p2p实现原理
- objective-c 内存管理1
- ios面试问题——oc是动态运行时语言是什么意思
- 防止程序被多次重复调用的代码
- Java Annotation注解
- Hibernate中 多对一,一对多映射关系分析详解
- 对于I/O流的理解
- 番茄助手vaassist常见用法