编程语言
首页 > 编程语言> > 程序设计思维与实践第二周实验---------C-瑞神打牌

程序设计思维与实践第二周实验---------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