留下做题痕迹
原题链接:26332.德州扑克2024-09-07 15:15:08
发布于:广东
无论你是斗地主大神、抽乌龟大师,还是德州扑克大佬
这道题纯纯模拟,列if else 就可以了,于是我列了44行+10行case
具体思路看题中注释
#include<bits/stdc++.h>
using namespace std;
struct poker{//每张扑克牌的两个性质
char color;
int number;
};
int lv,n,vis[5];
char lc;
poker all[7],cho[5];//user为已有,cho为选择的
bool cmp(poker a,poker b){
return a.number<b.number;
}
void power(){//牌力
//I am the strom that is apoorching!!!
int same2=0,same3=0,same4=0;//标记相同了n个的数量
bool colsame=0,shun=0;//colsame表示同花,shun就是顺子
if(cho[0].number==cho[1].number)same2++;//开始叠if
if(cho[1].number==cho[2].number)same2++;//两张相同
if(cho[2].number==cho[3].number)same2++;
if(cho[3].number==cho[4].number)same2++;
if(cho[0].number==cho[1].number&&cho[1].number==cho[2].number)same3++;//三张相同
if(cho[1].number==cho[2].number&&cho[2].number==cho[3].number)same3++;
if(cho[2].number==cho[3].number&&cho[3].number==cho[4].number)same3++;
if(cho[0].number==cho[1].number&&cho[1].number==cho[2].number&&cho[2].number==cho[3].number)same4++;//四张相同
if(cho[1].number==cho[2].number&&cho[2].number==cho[3].number&&cho[3].number==cho[4].number)same4++;
if(cho[0].color==cho[1].color&&cho[1].color==cho[2].color&&cho[2].color==cho[3].color&&cho[3].color==cho[4].color)colsame=1;//同花
if((cho[0].number==1&&cho[4].number==13||cho[0].number+1==cho[1].number)&&cho[1].number+1==cho[2].number&&cho[2].number+1==cho[3].number&&cho[3].number+1==cho[4].number)shun=1;//顺子,A既是1也是14,特殊判断
if(shun&&colsame&&cho[0].number==1&&cho[1].number==10)lv=10;//判断牌力,每一个的判断基本都在详情给出了
else if(shun&&colsame)lv=max(9,lv);
else if(same4==1)lv=max(lv,8);
else if(same3==1&&same2==3)lv=max(lv,7);
else if(colsame)lv=max(lv,6);
else if(shun)lv=max(lv,5);
else if(same3==1&&same2==2)lv=max(lv,4);
else if(same2==2)lv=max(lv,3);
else if(same2==1)lv=max(lv,2);
else lv=max(lv,1);
}
int main(){
scanf("%d\n",&n);//输入样例数
while(n--){
lv=1;
for(int i=0;i<=6;i++){//输入七张牌的颜色和大小,有一些大小要特殊处理
scanf("%c%c ",&lc,&all[i].color);
if(lc=='A')all[i].number=1;//特殊处理
else if(lc=='T')all[i].number=10;
else if(lc=='J')all[i].number=11;
else if(lc=='Q')all[i].number=12;
else if(lc=='K')all[i].number=13;
else all[i].number=lc-'0';
if(i==1)scanf("\n");//scanf的特性
}
int zj;
for(int i=0;i<=6;i++){//枚举七个牌里面的两张不要的
for(int j=0;j<=6;j++){
zj=0;
if(i==j)continue;
for(int k=0;k<=6;k++){//加入选择数组
if(k==i||k==j)continue;
cho[zj++]=all[k];
}
/*for(int k=0;k<5;k++){//测试代码,查bug用
printf("%c%c ",cho[k].number,cho[k].color);
}*/
sort(cho,cho+5,cmp);//排序,更方便顺子判断
power();//判断
//printf("\n");
}
}
switch(lv){//输出牌力
case 10:printf("ROYAL FLUSH\n");break;
case 9:printf("STRAIGHT FLUSH\n");break;
case 8:printf("FOUR OF A KIND\n");break;
case 7:printf("FULL HOUSE\n");break;
case 6:printf("FLUSH\n");break;
case 5:printf("STRAIGHT\n");break;
case 4:printf("THREE OF KIND\n");break;
case 3:printf("TWO PAIR\n");break;
case 2:printf("ONE PAIR\n");break;
default:printf("HIGH CARD\n");break;
}
}
return 0;
}
9.7摸鱼,减少了行数(实在不会继续简略了...)
#include<bits/stdc++.h>
using namespace std;
struct poker{//每张扑克牌的两个性质
char color;
int number;
};
int lv,n,vis[5];
char lc;
poker all[7],cho[5];//user为已有,cho为选择的
bool cmp(poker a,poker b){
return a.number<b.number;
}
void power(){//牌力
int same2=0,same3=0,same4=0;//标记相同了n个的数量
bool colsame=0,shun=0;//colsame表示同花,shun就是顺子
for(int i=0;i<=3;i++)if(cho[i].number==cho[i+1].number)same2++;//两张相同
for(int i=0;i<=2;i++)if(cho[i].number==cho[i+1].number&&cho[i+1].number==cho[i+2].number)same3++;//三张相同
for(int i=0;i<=1;i++)if(cho[i].number==cho[i+1].number&&cho[i+1].number==cho[i+2].number&&cho[i+2].number==cho[i+3].number)same4++;//四张相同
if(cho[0].color==cho[1].color&&cho[1].color==cho[2].color&&cho[2].color==cho[3].color&&cho[3].color==cho[4].color)colsame=1;//同花
if((cho[0].number==1&&cho[4].number==13/*a为14时*/||cho[0].number+1==cho[1].number/*a为1时*/)&&cho[1].number+1==cho[2].number&&cho[2].number+1==cho[3].number&&cho[3].number+1==cho[4].number)shun=1;//顺子,A既是1也是14,特殊判断
if(shun&&colsame&&cho[0].number==1&&cho[1].number==10)lv=10;//判断牌力,每一个的判断基本都在详情给出了
else if(shun&&colsame)lv=max(9,lv);
else if(same4==1)lv=max(lv,8);
else if(same3==1&&same2==3)lv=max(lv,7);
else if(colsame)lv=max(lv,6);
else if(shun)lv=max(lv,5);
else if(same3==1&&same2==2)lv=max(lv,4);
else if(same2==2)lv=max(lv,3);
else if(same2==1)lv=max(lv,2);
else lv=max(lv,1);
}
int main(){
scanf("%d\n",&n);//输入样例数
while(n--){
lv=1;
for(int i=0;i<=6;i++){//输入七张牌的颜色和大小,有一些大小要特殊处理
scanf("%c%c ",&lc,&all[i].color);
if(lc=='A')all[i].number=1;//特殊处理,>=10的字母转数字
else if(lc=='T')all[i].number=10;
else if(lc=='J')all[i].number=11;
else if(lc=='Q')all[i].number=12;
else if(lc=='K')all[i].number=13;
else all[i].number=lc-'0';
if(i==1)scanf("\n");//scanf的特性,没有的话里面存了个换行符
}
int zj;
for(int i=0;i<=6;i++){//枚举七个牌里面的两张不要的
for(int j=0;j<=6;j++){//(同上)
zj=0;
if(i==j)continue;//不能选择同个卡牌
for(int k=0;k<=6;k++){//加入选择数组
if(k==i||k==j)continue;
cho[zj++]=all[k];
}
sort(cho,cho+5,cmp);//排序,更方便判断对/顺子
power();//判断
}
}
switch(lv){//输出牌力
case 10:printf("ROYAL FLUSH\n");break;
case 9:printf("STRAIGHT FLUSH\n");break;
case 8:printf("FOUR OF A KIND\n");break;
case 7:printf("FULL HOUSE\n");break;
case 6:printf("FLUSH\n");break;
case 5:printf("STRAIGHT\n");break;
case 4:printf("THREE OF KIND\n");break;
case 3:printf("TWO PAIR\n");break;
case 2:printf("ONE PAIR\n");break;
default:printf("HIGH CARD\n");break;
}
}
return 0;
}
这里空空如也
有帮助,赞一个