• Week2实验 C--瑞神打牌 POJ


    题目描述:

    定义牌的顺序,首先,花色是(梅花)<(方片)<(黑桃)<(红桃),(输入时,我们用C,D,S,H分别表示梅花,方片,黑桃,红桃,即其单词首字母)。对于牌面的值,我们规定2 < 3 < 4 < 5 < 6 < 7 < 8 < 9 < T < J < Q < K < A。现在你作为上帝,你要从小到大排序每个人手中的牌,并按照给定格式输出。输入时,指定发牌人,不过发牌人不先发自己,而是先发下一个人,输出顺序是SWNE。

    思路:

    直接看SWNE分别拿到了第几套14张牌,比如S先拿到第一张牌,那么S拿的牌就是4i+0,W拿的牌就是4i+1。然后排序输出即可

    总结:

    主要两个问题:第一个是对于除模取余循环的数,还是要从0开始,比如模数是4,就要用0123编号,而不能用1234,下面的代码就从1开始,还要多写特判。第二个是对二维数组按行排序,虽然把指针转换成int*然后再计算first和end地址,但是经过前几题的启发,还是用vector方便。

    代码:

    最初版本

      1 //不模拟发牌过程,直接得到发牌结果
      2 //p数组依次按行存储花色的牌,p[i][0]存储第i花色有几张牌,处理完每个玩家都重置p数组
      3 #include <cstdio>
      4 #include <iostream>
      5 #include <algorithm>
      6 #include <map>
      7 #include <string>
      8 #include <cstring>
      9 using namespace std;
     10   
     11 int p[10][50];
     12 char player[10][20]={" ","South player:","West player:","North player:","East player:"};
     13 char letter[10]="0CDSH";
     14 map<char,int> mp3;
     15 
     16 map<char,int> mp;
     17 map<int,char> mp2;
     18 char ss[200];
     19 void func(int x,int num)
     20 {
     21     p[x][0]++;
     22     int t=p[x][0];
     23     p[x][t]=num;
     24 }
     25 void read(int t)
     26 {
     27     for(int i=0;i<13;i++)
     28     {
     29         char c1=ss[2*t-1+i*8];  //花色
     30         char c2=ss[2*t+i*8]; 
     31         int num=0;
     32         if(c2<='9'&&c2>='2')  num=c2-'0';
     33         else num=mp[c2];
     34         
     35         func(mp3[c1],num);
     36         
     37     }
     38 }
     39 void sort_()
     40 {
     41     for(int i=1;i<=4;i++)
     42         sort( (int*)p+50*i+1 , (int*)p+50*i+p[i][0]+1);  //如果用vector,就不用再计算地址,下次尝试.
     43     
     44 }
     45 void output(int j)
     46 {
     47     cout<<player[j]<<endl;
     48     cout<<"+---+---+---+---+---+---+---+---+---+---+---+---+---+"<<endl;
     49     for(int i=1;i<=4;i++)
     50     {
     51         for(int j=1;j<=p[i][0];j++)
     52         {
     53             if(p[i][j]<=9&&p[i][j]>=2) printf("|%d %d",p[i][j],p[i][j]);
     54             else printf("|%c %c",mp2[ p[i][j] ],mp2[ p[i][j] ]);
     55         }            
     56     }
     57     cout<<"|"<<endl;
     58     
     59     for(int i=1;i<=4;i++)
     60     {
     61         for(int j=1;j<=p[i][0];j++)
     62         {
     63             printf("| %c ",letter[i]);
     64         }            
     65     }
     66     cout<<"|"<<endl;
     67     
     68     for(int i=1;i<=4;i++)
     69     {
     70         for(int j=1;j<=p[i][0];j++)
     71         {
     72             if(p[i][j]<=9&&p[i][j]>=2) printf("|%d %d",p[i][j],p[i][j]);
     73             else printf("|%c %c",mp2[ p[i][j] ],mp2[ p[i][j] ]);
     74         }            
     75     }
     76     cout<<"|"<<endl;
     77     
     78     cout<<"+---+---+---+---+---+---+---+---+---+---+---+---+---+"<<endl;
     79 
     80 }
     81 int main()
     82 {
     83     //freopen("a.in","r",stdin);
     84     mp['T']=10,mp['J']=11,mp['Q']=12,mp['K']=13,mp['A']=14;
     85     mp2[10]='T',mp2[11]='J',mp2[12]='Q',mp2[13]='K',mp2[14]='A'; 
     86     mp3['C']=1,mp3['D']=2,mp3['S']=3,mp3['H']=4;
     87     while(1)
     88     {
     89         int t=0;
     90         string s; cin>>s;
     91         char c=s[0];
     92         if(c=='#') return 0;
     93         else if(c=='W') t=3;
     94         else if(c=='N') t=2;
     95         else if(c=='E') t=1;
     96         else t=4;
     97         
     98         scanf("%s %s",ss+1,ss+53); //把所有的牌读进来
     99         //从S开始处理 
    100         for(int i=1;i<=4;i++)
    101         {
    102             memset(p,0,sizeof(p));
    103             read(t);//读牌 
    104             sort_();//排序 
    105             output(i);//输出
    106             
    107             //下一轮
    108             t= (t==4) ? 1 : t+1;  //以后还是t从0开始用
    109         }
    110         cout<<endl;
    111     }
    112 }
    113  

     后来用vector简单改写了一下(第一次使用vector):

     2 #include <cstdio>
     3 #include <iostream>
     4 #include <algorithm>
     5 #include <map>
     6 #include <string>
     7 #include <cstring>
     8 #include <vector>
     9 using namespace std;
    10   
    11 vector<int> p[10];
    12 char s[200];
    13 char player[10][20]={" ","South player:","West player:","North player:","East player:"};
    14 char col[10]="0CDSH";
    15 
    16 map<char,int> color,value,pos; //花色,数值,方位 
    17 map<int,char> letter;    //输出时,数值变成字母 
    18 
    19 void read(int t)
    20 {
    21     for(int i=0;i<13;i++)
    22     {
    23         char c1=s[2*t+i*8]; int t1=color[c1];  //花色
    24         char c2=s[2*t+1+i*8]; int t2=value[c2]; //数值 
    25         p[t1].push_back(t2);
    26     }
    27 }
    28 void sort_()
    29 {
    30     for(int i=1;i<=4;i++)
    31         sort( p[i].begin() , p[i].end() );
    32     
    33 }
    34 void output(int j)
    35 {
    36     cout<<player[j]<<endl;
    37     cout<<"+---+---+---+---+---+---+---+---+---+---+---+---+---+"<<endl;
    38     
    39     for(int i=1;i<=4;i++)
    40         for(int j=0,n=p[i].size(); j<n;j++)
    41             printf("|%c %c",letter[ p[i][j] ],letter[ p[i][j] ]);
    42             
    43     cout<<"|"<<endl;
    44     
    45     for(int i=1;i<=4;i++)
    46         for(int j=1,n=p[i].size(); j<=n; j++)   //不支持C++11
    47             printf("| %c ",col[i]);
    48 
    49     cout<<"|"<<endl;
    50     
    51      for(int i=1;i<=4;i++)
    52         for(int j=0,n=p[i].size(); j<n;j++)
    53             printf("|%c %c",letter[ p[i][j] ],letter[ p[i][j] ]);
    54             
    55     cout<<"|"<<endl; 
    56     cout<<"+---+---+---+---+---+---+---+---+---+---+---+---+---+"<<endl;
    57 
    58 }
    59 int main()
    60 {
    61     //freopen("a.in","r",stdin);
    62     
    63     value['T']=10,value['J']=11,value['Q']=12,value['K']=13,value['A']=14;
    64     for(int i='2';i<='9';i++) value[i]=i-'0';
    65     
    66     color['C']=1,color['D']=2,color['S']=3,color['H']=4; 
    67 
    68     letter[10]='T',letter[11]='J',letter[12]='Q',letter[13]='K',letter[14]='A';
    69     for(int i=2;i<=9;i++) letter[i]=i+'0';
    70     
    71     pos['W']=2,pos['N']=1,pos['E']=0,pos['S']=3;
    72     
    73     while( ~scanf("%s",s) && s[0]!='#' )
    74     {
    75         int t=pos[ s[0] ];
    76         scanf("%s %s",s,s+52); //把所有的牌读进来
    77         
    78         //从S开始处理 
    79         for(int i=1;i<=4;i++)
    80         {
    81             for(int i=1;i<=4;i++) p[i].clear();
    82             read(t);        //读牌 
    83             sort_();        //排序 
    84             output(i);        //输出
    85             t=(t+1)%4;
    86         }
    87         cout<<endl;
    88     }
    89 }
  • 相关阅读:
    mysql数据库的相关练习题及答案
    数据库一
    python的协程
    jquery的常用知识点
    diehard–让你的程序更健壮
    迷宫塔生成工具
    编程解决谁是凶手的问题
    ClojureScript实现xpath定位器生成-1
    使用ClojureScript进行chrome扩展开发
    AES CBC模式下的Padding Oracle解密
  • 原文地址:https://www.cnblogs.com/qingoba/p/12420898.html
Copyright © 2020-2023  润新知