程序设计思维Week2-实验

程序设计思维Week2-实验

A-烷烃基判断

问题描述

烷烃基有6个原子和5个化学键,共有5种不同的结构如下图在这里插入图片描述
6个原子分别标号1~6,然后用一对数字 a,b 表示原子a和原子b间有一个化学键。
输入5对数字,要求甄别由这五条链组成的烷烃基的类别

解法分析

首先自定义couple结构用于储存每个烷烃基的五条链,定义数组c用于记录每个节点的入度,通过节点的入度区别每个类别,例如2,2-dimethylbutane具有一个入度为4的节点,2,3-dimethylbutane具有两个入度为3的节点,n-hexane所有节点的入度都小于3,而2-methylpentane和3-methylpentane都具有一个入度为3的节点,因此需要将进一步判断两种类别中与入度为3的节点相连的节点的入度,可以发现前者有两个入度为1的节点与之相连,而后者仅有一个。

总结

该题需要甄别烷烃基的类型,重在发现每个类别的特点,再根据特点依次判断即可。
需要注意的:

  1. 在区分2-methylpentane和3-methylpentane时不可仅仅判断入度为3的点个数,还要计算与之相连的入度为1的点个数。
  2. 为了减少时间复杂度,可以设置一个bool值,当该烷烃基确定类型后跳出循环。

代码

#include <iostream>
#include <string>
using namespace std;
int c[7];

struct couple {
	int a,b;
};

int main()
{
	int t;
	cin >> t;

	while (t--) {
		couple p[5];
		for (int i = 1; i <= 6; i++)
			c[i] = 0;
		for (int i = 0; i < 5; i++) {
			
			cin >> p[i].a >> p[i].b;
			c[p[i].a]++;
			c[p[i].b]++;
		}

		string res;
		bool flag = false;
		while (true) {
			for (int i = 1; i <= 6; i++) {
				if (c[i] == 3||c[i]==4)break;
				if (i == 6) {
					res = "n-hexane"; flag=true;
				}
			}
			if (flag)break;
			int k = 0;
			int temp[2];
			for (int i = 1; i <= 6; i++) {
				if (c[i] == 3) { temp[k++] = i; }
				if (i == 6 && k == 2) {
					res = "2,3-dimethylbutane"; flag = true;
				}
			}
			if (flag)break;

			if (k == 1) {
				int m = temp[0], count = 0;
				//int single[2];
				for (int i = 0; i < 5; i++) {
					if ((p[i].a == m && c[p[i].b] == 1) || (p[i].b == m && c[p[i].a] == 1))count++;

				}
				if (count == 2) { res = "2-methylpentane"; flag = true; }
				else if (count == 1){res = "3-methylpentane"; flag = true;}
			}
			
			if (flag)break;


			for (int i = 1; i <= 6; i++) {
				if (c[i] == 4) { res = "2,2-dimethylbutane"; flag = true; break; }
			}
			if (flag)break;
		}
		cout << res << endl;
	}
}

B-程序设计成绩排名问题

问题描述

某次考试一共n道题,每个人做的题都在对应的题号下有个数量标记,负数表示该学生在该题上有过的错误提交次数但到现在还没有AC,正数表示AC所耗的时间,如果正数a跟上了一对括号,里面有个正数b,则表示该学生AC了这道题,耗去了时间a,同时曾经错误提交了b次,在这种情况下每次错误提交都要乘以单位罚时m计入总时间。
输入题数n(1≤n≤12)以及单位罚时m(10≤m≤20),之后的每行数据描述一个学生的信息,首先是学生的用户名(不多于10个字符的字串)其次是所有n道题的得分现状。要求根据每位学生的得分现状进行排名,第一顺序是AC题数降序,第二顺序是总时间升序,第三顺序是名字的字典序。

解法分析

根据题意我们需要获得每位学生的AC题数和总时间,定义Student结构体记录每个学生的姓名、得分、总时间。将每位学生每个题目的情况看成一个字符串,所以对于未AC的题目的字符串可以直接忽略,而对于AC的题目,在“(”之前的字符转换成整型加入总时间,而在括号中的数字转换成整型乘以单位罚时加入总时间,同时增加该学生的score。
得到所有学生的得分现状后,根据题目的排序规则进行排序,依次按照格式输出。

总结

该题难点在于读入每位学生的得分数据,可以将每位学生每个题目情况看成一个字符串,根据以左括号为界限分别计算括号两边的数。

代码

#include <iostream>
#include <string>
#include <algorithm>
#include <iomanip>
using namespace std;

struct Student {
	string name;
	int score;
	int time;


}stu[1000];

bool compare(Student x, Student y) {
	if (x.score != y.score)return x.score > y.score;
	else {
		if (x.time != y.time)return x.time < y.time;
		else return x.name < y.name;
	}
}
void output(Student x) {
	cout.width(10);
	cout << std::left << x.name;
	cout << " ";
	cout.width(2);
	cout << std::right<<x.score ;
	cout << " ";
	cout.width(4);
	cout << std::right<< x.time << endl;
}

int k = 0;
int main()
{
	int n, m;
	cin >> n >> m;

	while (cin >> stu[k].name) {
		stu[k].score = 0;
		stu[k].time = 0;
		for (int i = 1; i <= n; i++) {
			string t;
			cin >> t;
			
			if (t[0] == '0' || t[0] == '-')continue;
			
			int j = 0;
			int tempt = 0;
			for (; t[j]!='('&&j<t.size(); j++) {
				tempt = (t[j]-'0') + tempt * 10;
				
			}
			
			int pt = 0;
			if (t[j] == '(') {
				j++;

				for (; t[j] != ')'&&j < t.size(); j++) {

					pt = (t[j]-'0') + pt * 10;
				}
				tempt += m * pt;
				
			}
			stu[k].time += tempt;
			stu[k].score++;
		}

		k++;
	}
	sort(stu, stu + k , compare);

	for (int i = 0; i < k; i++)
		output(stu[i]);

}

C-扑克牌排序问题

问题描述

牌局由四个人构成,围成一圈。我们称四个方向为北 东 南 西。对应的英文是North,East,South,West。游戏一共由一副扑克,也就是52张构成。开始,我们指定一位发牌员(东南西北中的一个,用英文首字母标识)开始发牌,发牌顺序为顺时针,发牌员第一个不发自己,而是发他的下一个人(顺时针的下一个人)。这样,每个人都会拿到13张牌。
现在我们定义牌的顺序,首先,花色是(梅花)<(方片)<(黑桃)<(红桃),(输入时,我们用C,D,S,H分别表示梅花,方片,黑桃,红桃,即其单词首字母)。对于牌面的值,我们规定2 < 3 < 4 < 5 < 6 < 7 < 8 < 9 < T < J < Q < K < A。
输入发牌员以及52张牌的发牌顺序,从小到大排序每个人手中的牌,并按照给定格式输出。

解法分析

首先我们可以使用map类对扑克牌的每种花色与每个值分别对应整型value,value表示它们在排序中的大小,value越大值就越大。同样,由于题意要求从South开始顺时针输出,可以用map类依序给他们赋予value。
自定义Player结构,记录每个人的名字(即方向)和13张牌,Card结构记录每张牌的花色和值。
一开始根据发牌员确定4个人的拿牌顺序(即4个人在数组中的index)。52张扑克都发完后,先根据输出顺序对4个人排序,再分别对每个人的13张牌根据花色和值进行排序。

总结

该题关键在于确定每种花色、值、输出玩家的顺序。
需要注意的:

  1. 在排序时要把4个人的牌分割开
  2. 花色或值要和index one-to-one映射,能根据花色或值获得index,也能根据index获得花色或值。

代码

#include <iostream>
#include <map>
#include<algorithm>
using namespace std;

struct Card {
	int cIndex;
	int vIndex;
};

struct Player {
	int name;
	Card card[13];
};

bool compare1(Player x,Player y) {
	return x.name < y.name;
}

bool compare2(Card x, Card y) {
	if (x.cIndex != y.cIndex)return x.cIndex < y.cIndex;
	else return x.vIndex < y.vIndex;
}
int main()
{
	map<char, int> members;
	members['S'] = 1; members['W'] = 2; members['N'] = 3; members['E'] = 4;

	map<char, int> numbers;
	numbers['2'] = 1; numbers['3'] = 2; numbers['4'] = 3; numbers['5'] = 4; numbers['6'] = 5; numbers['7'] = 6; numbers['8'] = 7; numbers['9'] = 8; numbers['T'] = 9; numbers['J'] = 10; numbers['Q'] = 11; numbers['K'] = 12; numbers['A'] = 13;

	map<char, int> colors;
	colors['C'] = 1; colors['D'] = 2; colors['S'] = 3; colors['H'] = 4;
	map<int, char> nu;
	nu[1] = '2'; nu[2] = '3'; nu[3] = '4'; nu[4] = '5'; nu[5] = '6'; nu[6] = '7'; nu[7] = '8'; nu[8] = '9'; nu[9] = 'T'; nu[10] = 'J'; nu[11] = 'Q'; nu[12] = 'K'; nu[13] = 'A'; 

	map<int, char> co;
	co[1] = 'C'; co[2] = 'D'; co[3] = 'S'; co[4] = 'H';

	while (true) {
		char mem;
		Player p[4];
		cin >> mem;
		if (mem == '#')return 0;
		p[3].name = members[mem];
		if (mem == 'N') { p[0].name = members['E']; p[1].name = members['S'];p[2].name = members['W'];}
		else if (mem == 'E') { p[0].name = members['S']; p[1].name = members['W']; p[2].name = members['N']; }
		else if (mem == 'S') { p[0].name = members['W']; p[1].name = members['N']; p[2].name = members['E']; }
		else if (mem == 'W') { p[0].name = members['N']; p[1].name = members['E']; p[2].name = members['S']; }
		int m = 0,n=0;
		for (int i = 1; i <= 52; i++) {
			char c, v;
			cin >> c >> v;
			p[m].card[n].cIndex = colors[c];
			p[m].card[n].vIndex = numbers[v];
			if (m == 3) {
				m = 0; n++;
			}
			else m++;
			
		}

		sort(p, p + 4,compare1);
		for (int i = 0; i <= 3; i++)
			sort(p[i].card, p[i].card + 13, compare2);
		//South
		printf("South player:\n+---+---+---+---+---+---+---+---+---+---+---+---+---+\n");
		for (int i = 0; i <= 12; i++) {
			cout << '|' << nu[p[0].card[i].vIndex] << ' ' << nu[p[0].card[i].vIndex];
		}
		printf("|\n");
		for (int i = 0; i <= 12; i++) {
			cout << '|' << ' '<<co[p[0].card[i].cIndex] <<' ';
		}
		printf("|\n");
		for (int i = 0; i <= 12; i++) {
			cout << '|' << nu[p[0].card[i].vIndex] << ' ' << nu[p[0].card[i].vIndex];
		}
		printf("|\n+---+---+---+---+---+---+---+---+---+---+---+---+---+\n");
		//West
		printf("West player:\n+---+---+---+---+---+---+---+---+---+---+---+---+---+\n");
		for (int i = 0; i <= 12; i++) {
			cout << '|' << nu[p[1].card[i].vIndex] << ' ' << nu[p[1].card[i].vIndex];
		}
		printf("|\n");
		for (int i = 0; i <= 12; i++) {
			cout << '|' << ' ' << co[p[1].card[i].cIndex] << ' ';
		}
		printf("|\n");
		for (int i = 0; i <= 12; i++) {
			cout << '|' << nu[p[1].card[i].vIndex] << ' ' << nu[p[1].card[i].vIndex];
		}
		printf("|\n+---+---+---+---+---+---+---+---+---+---+---+---+---+\n");
		//North
		printf("North player:\n+---+---+---+---+---+---+---+---+---+---+---+---+---+\n");
		for (int i = 0; i <= 12; i++) {
			cout << '|' << nu[p[2].card[i].vIndex] << ' ' << nu[p[2].card[i].vIndex];
		}
		printf("|\n");
		for (int i = 0; i <= 12; i++) {
			cout << '|' << ' ' << co[p[2].card[i].cIndex] << ' ';
		}
		printf("|\n");
		for (int i = 0; i <= 12; i++) {
			cout << '|' << nu[p[2].card[i].vIndex] << ' ' << nu[p[2].card[i].vIndex];
		}
		printf("|\n+---+---+---+---+---+---+---+---+---+---+---+---+---+\n");
		//East
		printf("East player:\n+---+---+---+---+---+---+---+---+---+---+---+---+---+\n");
		for (int i = 0; i <= 12; i++) {
			cout << '|' << nu[p[3].card[i].vIndex] << ' ' << nu[p[3].card[i].vIndex];
		}
		printf("|\n");
		for (int i = 0; i <= 12; i++) {
			cout << '|' << ' ' << co[p[3].card[i].cIndex] << ' ';
		}
		printf("|\n");
		for (int i = 0; i <= 12; i++) {
			cout << '|' << nu[p[3].card[i].vIndex] << ' ' << nu[p[3].card[i].vIndex];
		}
		printf("|\n+---+---+---+---+---+---+---+---+---+---+---+---+---+\n\n");

	}
}

发布了21 篇原创文章 · 获赞 5 · 访问量 788

猜你喜欢

转载自blog.csdn.net/weixin_44578615/article/details/104663720