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  

猜你喜欢

转载自www.cnblogs.com/qingoba/p/12420898.html
今日推荐