AlenaNuna

导航

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 }

题外话:华为真的很喜欢出恶心的大模拟啊,但是对码力提升确实很有帮助…我都被恶心习惯了=。=

 

posted on 2024-09-03 18:00  AlenaNuna  阅读(14)  评论(0编辑  收藏  举报