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 }