HJ88 扑克牌大小
题面:
https://www.nowcoder.com/practice/d290db02bacc4c40965ac31d16b1c3eb?tpId=37&tqId=21311&rp=1&ru=/exam/oj/ta&qru=/exam/oj/ta&sourceUrl=%2Fexam%2Foj%2Fta%3FtpId%3D37&difficulty=undefined&judgeStatus=undefined&tags=&title=
本来觉得好容易的一个模拟题,结果调了好久好久我就彻底老实了
感觉自己码力还是太弱了,一开始思路没有想好,写的做法很丑陋。
重构了之后想了更好的思路,才顺利写出来……T_T
init()函数用于读入两组手牌。读入方式是每个字符读入,每张手牌拆分成一个字符串存储。
WorkspNum()用于把两组手牌中每张手牌的字符串转化成该卡牌代表的数值大小,并存储在spNum[2][手牌数]中
ZhaDan(int x)函数用于判断该组卡牌是否构成炸弹,并且返回炸弹代表的数值。若不是炸弹返回-1.
Work()函数就是分情况解决问题。如果0号选手手牌数为1/3/5,则0号手上不可能有炸弹。1号的合法回应是出同样数目的手牌或者出炸弹。判断一下就可以。
如果0号手牌数为2,那么0号只有两种情况:炸弹或者对子。判断一下就OK。
如果0号手牌数为4,那么0号手中必为炸弹,判断此时1号手中是不是炸弹,如果1号手中不是炸弹,则0号获胜,如果1号手中是炸弹,就魔法对轰比较数值)
Win(int x)函数用于输出赢家手牌。
1 #include<bits/stdc++.h> 2 using namespace std; 3 char sp[2][10][10]; 4 int paishu[2],spNum[2][10]; 5 void init(){ 6 char c=getchar(); 7 while(c!='-'){ 8 paishu[0]++; 9 int len=0; 10 if(c==' ')c=getchar(); 11 while(c!=' '&&c!='-'){ 12 sp[0][paishu[0]][len++]=c; 13 c=getchar(); 14 } 15 } 16 while(c!='\n'){ 17 paishu[1]++; 18 int len=0; 19 c=getchar(); 20 while(c!=' '&&c!='\n'){ 21 sp[1][paishu[1]][len++]=c; 22 c=getchar(); 23 } 24 } 25 return; 26 } 27 void WorkspNum(){ 28 for(int i=0;i<2;i++){ 29 for(int j=1;j<=paishu[i];j++){ 30 int len=strlen(sp[i][j]); 31 if(len==5){ 32 if(sp[i][j][0]=='j')spNum[i][j]=99; 33 else spNum[i][j]=100; 34 } 35 if(len==2) spNum[i][j]=10; 36 if(len==1){ 37 char c=sp[i][j][0]; 38 if(c>='3'&&c<='9') spNum[i][j]=c-'3'+3; 39 if(c=='J') spNum[i][j]=11; 40 if(c=='Q') spNum[i][j]=12; 41 if(c=='K') spNum[i][j]=13; 42 if(c=='A') spNum[i][j]=14; 43 if(c=='2') spNum[i][j]=15; 44 } 45 } 46 } 47 return; 48 } 49 int ZhaDan(int u){ 50 if(spNum[u][1]+spNum[u][2]==199) return 10000; 51 if(paishu[u]==4){ 52 return spNum[u][1]*100; 53 } 54 return -1; 55 } 56 int Work(){ 57 if(paishu[0]==1||paishu[0]==3||paishu[0]==5){ 58 if(paishu[1]==paishu[0]){ 59 if(spNum[0][1]>spNum[1][1]) return 0; 60 else return 1; 61 } 62 else{ 63 if(ZhaDan(1)>0) return 1; 64 else return -1; 65 } 66 } 67 if(paishu[0]==2){ 68 if(ZhaDan(0)>0) return 0; 69 if(paishu[1]!=2){ 70 if(ZhaDan(1)>0) return 1; 71 } 72 else{ 73 if(ZhaDan(1)>0) return 1; 74 if(spNum[0][1]>spNum[1][1])return 0; 75 else return 1; 76 } 77 } 78 if(paishu[0]==4){ 79 if(ZhaDan(0)>ZhaDan(1)) return 0; 80 else return 1; 81 } 82 return -1; 83 } 84 void Win(int x){ 85 if(x==0||x==1){ 86 for(int i=1;i<=paishu[x];i++) 87 printf("%s ",sp[x][i]); 88 exit(0); 89 } 90 printf("ERROR"); 91 exit(0); 92 return; 93 } 94 int main(){ 95 init(); 96 WorkspNum(); 97 int ans=Work(); 98 if(ans==0) Win(0); 99 else if(ans==1) Win(1); 100 else Win(-1); 101 return 0; 102 }
题外话:华为真的很喜欢出恶心的大模拟啊,但是对码力提升确实很有帮助…我都被恶心习惯了=。=