ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

程序设计思维与实践第二周实验---------C-瑞神打牌

2020-02-28 19:10:05  阅读:320  来源: 互联网

标签:map 瑞神 int dir player 第二周 mp 打牌 outmp


题意

在这里插入图片描述

思路

这道题思路就是读入数据之后,排序,然后再输出,用结构体存储数据,用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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有