程序设计思维与实践第二周实验---------C-瑞神打牌
作者:互联网
题意
思路
这道题思路就是读入数据之后,排序,然后再输出,用结构体存储数据,用map容器来将字符映射成数字。
总结
这道题用了将近两个小时的时间,但是挺崩溃的,因为我本来感觉这道题还算比较简单的,因为只需要读入排序输出就好,读入输出也比上道题要简单一些。
这道题用了大量的map容器,但是map容器的时间复杂度比较差,可能会TLE,做的时候卡住了几次,其一,如果在定义map的时候用了const,那么这个map就不能引用了,int num=dir[beg];这句代码就会出错;其二,c++11以上的版本才支持用大括号进行初始化赋值,c++11以下的版本不支持会编译错误,虽然现在的编译器版本大都比较新,但是还是要记住,否则可能会卡住很久。
这道题很多地方用到了map容器,所以主代码部分比较整洁,省去了很多复制粘贴的代码,感受到了map带来的便利。
代码
#include<iostream>
#include<map>
#include<string>
using namespace std;
/* 不能用的初始化map
({
{'C',20},
{'D',30},
{'S',40},
{'H',50},
{'1',1},
{'2',2},
{'3',3},
{'4',4},
{'5',5},
{'6',6},
{'7',7},
{'8',8},
{'9',9},
{'T',10},
{'J',11},
{'Q',12},
{'K',13},
{'A',14}
});
*/
/*({ 不能用的初始化map
{1,'1'},
{2,'2'},
{3,'3'},
{4,'4'},
{5,'5'},
{6,'6'},
{7,'7'},
{8,'8'},
{9,'9'},
{10,'T'},
{11,'J'},
{12,'Q'},
{13,'K'},
{14,'A'},
{20,'C'},
{30,'D'},
{40,'S'},
{50,'H'}
});*/
/*({ 不能用的初始化map
{'S',0},
{'W',1},
{'N',2},
{'E',3}
});*/
/*({ 不能用的初始化map
{0,"South player:"},
{1,"West player:"},
{2,"North player:"},
{3,"East player:"}
});*/
map<char,int> mp; //第一个map是将输入的字符转成数字
map<int,char> outmp; //第二个map是在输出的时候将数字转成字符
map<char,int> dir; //第三个map是将开始人的方位转成数字
map<int,string> player; //第四个map是将数字转成字符串,其实不必要,完全可以用数组代替且性能更优
struct node{ //存储牌的花色和大小
int color;
int size;
node(int c=0,int s=0) {
color=c;
size=s;
}
bool operator > (const node& n) { //重载比较运算符
if(color!=n.color) return color>n.color;
else return size>n.size;
}
};
node card[4][13];
int main() { //这是用了普通的map赋值方法
mp['C']=20;
mp['D']=30;
mp['S']=40;
mp['H']=50;
mp['1']=1;
mp['2']=2;
mp['3']=3;
mp['4']=4;
mp['5']=5;
mp['6']=6;
mp['7']=7;
mp['8']=8;
mp['9']=9;
mp['T']=10;
mp['J']=11;
mp['Q']=12;
mp['K']=13;
mp['A']=14;
outmp[1]='1';
outmp[2]='2';
outmp[3]='3';
outmp[4]='4';
outmp[5]='5';
outmp[6]='6';
outmp[7]='7';
outmp[8]='8';
outmp[9]='9';
outmp[10]='T';
outmp[11]='J';
outmp[12]='Q';
outmp[13]='K';
outmp[14]='A';
outmp[20]='C';
outmp[30]='D';
outmp[40]='S';
outmp[50]='H';
dir['S']=0;
dir['W']=1;
dir['N']=2;
dir['E']=3;
player[0]="South player:";
player[1]="West player:";
player[2]="North player:";
player[3]="East player:";
char beg;
while(cin>>beg) {
if(beg=='#') return 0; //如果输入的是#代表结束
int num=dir[beg]; //记录下发牌的人
for(int i=0;i<52;i++) { //这个循环就是记录输入,从发牌的人开始将每个人的牌存到数组中
char a,b;
cin>>a>>b;
num=(num+1)%4; //4个人一圈,用求余
card[num][i/4] = node(mp[a],mp[b]); //这个地方i/4可以判断是第几轮发牌
}
for(int i=0;i<4;i++) { //这个地方使用了冒泡排序
for(int j=0;j<12;j++) {
for(int k=0;k<12;k++) {
if(card[i][k]>card[i][k+1]) swap(card[i][k],card[i][k+1]);
}
}
}
for(int i=0;i<4;i++) { //输出,用了map
cout<<player[i]<<endl;
cout<<"+---+---+---+---+---+---+---+---+---+---+---+---+---+"<<endl;
for(int j=0;j<13;j++) cout<<'|'<<outmp[card[i][j].size]<<' '<<outmp[card[i][j].size];
cout<<'|'<<endl;
for(int j=0;j<13;j++) cout<<'|'<<' '<<outmp[card[i][j].color]<<' ';
cout<<'|'<<endl;
for(int j=0;j<13;j++) cout<<'|'<<outmp[card[i][j].size]<<' '<<outmp[card[i][j].size];
cout<<'|'<<endl;
cout<<"+---+---+---+---+---+---+---+---+---+---+---+---+---+"<<endl;
}
cout<<endl;
}
}
chenmu2000
发布了3 篇原创文章 · 获赞 0 · 访问量 30
私信
关注
标签:map,瑞神,int,dir,player,第二周,mp,打牌,outmp 来源: https://blog.csdn.net/chenmu2000/article/details/104561514