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

题目描述:

定义牌的顺序,首先,花色是(梅花)<(方片)<(黑桃)<(红桃),(输入时,我们用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 }

 

posted @ 2020-03-05 16:21  菜鸡今天学习了吗  阅读(174)  评论(0编辑  收藏  举报