蓝桥杯 判断名次-全排列

 

 

#include <iostream>
#include <stdio.h>
#include <map>
#include <algorithm>
using namespace std;
int a[10];//数组a的作用是什么
//a[i] 存储第i个人的名次 - -我们认为,ABCDE对应12345
bool flag[10];
//接受输入
void acceptCondition(char s[],int i) {
	if (s[2] == '=') {
		if (s[1] == '!') {
			flag[i] = a[s[0] - 'A' + 1] != (s[3] - '0');
		}
		if (s[1] == '>') {
			flag[i] = a[s[0] - 'A' + 1] >= (s[3] - '0');
		}
		if (s[1] == '<') {
			flag[i] = a[s[0] - 'A' + 1] <= (s[3] - '0');
		}
	}
	else
	{
		if (s[1] == '=') {
			flag[i] = a[s[0] - 'A' + 1] == (s[2] - '0');
		}
		if (s[1] == '>') {
			flag[i] = a[s[0] - 'A' + 1] > (s[2] - '0');
		}
		if (s[1] == '<') {
			flag[i] = a[s[0] - 'A' + 1] < (s[2] - '0');
		}
	}

}

int main() {
	for (int i = 1; i <= 5; i++) {
		a[i] = i;
	}
	char s[6][10];
	int ans = 0;
	for (int i = 1; i <= 5; i++) {
		cin >> s[i];
	}
	do {
		for (int i = 1; i <= 5; i++) {
			acceptCondition(s[i], i);
			if (a[i] % 2 == 1) {
				flag[i] = !flag[i];
			}
		}
		if (flag[1] && flag[2] && flag[3] && flag[4] && flag[5]) {
			int m = 1;
			while (m <= 5) {
				for (int k = 1; k <= 5; k++) {
					if (a[k] == m)
					{
						printf("%c", k + 'A' - 1);
						break;
					}
				}
				m++;
			}
			cout << endl;
			ans++;
		}
	} while (next_permutation(a + 1, a + 6));
	cout << ans;
	return 0;
}
/*
 int main() {
	for (int i = 1; i <= 5; i++) {
		a[i] = i;
	}
	char s[6][10];
	int ans = 0;
	for (int i = 1; i <= 5; i++) {
		cin >> s[i];
	}
	do {
		for (int i = 1; i <= 5; i++) {
			acceptCondition(s[i], i);
			if (a[i] % 2 == 1) {
				flag[i] = !flag[i];
			}
		}
		if (flag[1] && flag[2] && flag[3] && flag[4] && flag[5]) {
			for (int p = 1; p <= 5; p++) {
					cout << a[p];
			}
			cout << endl;
			int m = 1;
			while (m<=5) {
				for (int k = 1; k <= 5; k++) {
					if (a[k] == m)
					{
						printf("%c", k + 'A' - 1);
						break;
					}
				}
				m++;
			}
			cout << endl;
			ans++;
		}
	} while (next_permutation(a + 1, a + 6));
	cout << ans;
	return 0;
}
*/
/*
int main() {
	for (int i = 1; i <= 5; i++) {
		a[i] = i;
	}
	char s[6][10];
	int ans = 0;
	char b[10];
	map<char, int> mp;
	for (int i = 1; i <= 5; i++) {
		b[i] = 'A'+i-1;
	}
	for (int i = 1; i <= 5; i++) {
		mp[b[i]] = i;
	}
	for (int i = 1; i <= 5; i++) {
		cin >> s[i];
	}
	do {
		for (int i = 1; i <= 5; i++) {
			a[i] = b[mp['A'+1-i]];//请注意a[i]存第'A'+i-1个人的名次 --mp[A]存储第A名的名次,
								  //我们始终认为ABCDE对应12345 -- 随着ABCDE的字典序,我们认为还是认为是12345对应ABCDE
			//a[i] = b[mp[ABCDE]]是把原本属于ABCDE的名次给了a[i] - - 改变了计算过程ABCDE的次序 -- 计算过程中不再是12345对应ABCDE
		}
		for (int i = 1; i <= 5; i++) {
			acceptCondition(s[i], i);
			if (a[i] % 2 == 1) {
				flag[i] = !flag[i];
			}
		}
		if (flag[1] && flag[2] && flag[3] && flag[4] && flag[5]) {
			
			for (int k = 1; k <= 5; k++) {
				std::cout << b[k];
			}
			std::cout << endl;
			ans++;
		}
	} while (next_permutation(b + 1, b + 6));
	std::cout << ans;
	return 0;
}
*/

简单说一下上面代码的错误之处,我固定了ABCDE,不断改变排名。

我需要将名次不动,不断改变每个名次对应的ABCDE,听起来这和我的错误思路是一样的,但是二者是有区别的,题目要求按字典序输出排名序列,就是固定了名次(依次是第1、2、3、4、5名)

#include <iostream>
#include <stdio.h>
#include <map>
#include <algorithm>
using namespace std;
int a[10];//数组a的作用是什么
//a[i] 存储第i个人的名次 - -我们认为,ABCDE对应12345
//bool flag[10];
//接受输入- - s[1]/s[2]/s[3]/s[4]/s[5]分别是ABCDE说的话--就是对应排列中的数字1、2、3、4、5,注意而1、2、3、4、5的下标就是ABCDE的赋予名次
bool acceptCondition(char s[]) {//s是说话人的话 - i 没有实际意义,这里不需要了--给他i一个实际意义,说话人话中的那个人的代号-我怎么知道说话人的名次赋值
	int index;
	int i;
	i = s[0] - 'A'+1;
	for (int k = 1; k <= 5; k++) {
		if (a[k] == i) {
			index = k;
			break;
		}
	}
	if (s[2] == '=') {
		if (s[1] == '!') {
			return index != (s[3] - '0');
		}
		if (s[1] == '>') {
			return  index >= (s[3] - '0');
		}
		if (s[1] == '<') {
			return index <= (s[3] - '0');
		}
	}
	else
	{
		if (s[1] == '=') {
			return index == (s[2] - '0');
		}
		if (s[1] == '>') {
			return  index > (s[2] - '0');
		}
		if (s[1] == '<') {
			return index < (s[2] - '0');
		}
	}

}
int main() {
	for (int i = 1; i <= 5; i++) {
		a[i] = i;
	}
	char s[6][10];
	int ans = 0;
	for (int i = 1; i <= 5; i++) {
		cin >> s[i];
	}
	do {
		//换种思路,我们知道了1、2、3、4、5名是谁(ABCDE)了,做个变换,结合谁说的话,也可以
		//a[1]就是第一名的代表数字
		 if(!acceptCondition(s[a[1]])&& acceptCondition(s[a[2]])
			 && !acceptCondition(s[a[3]])&& acceptCondition(s[a[4]])
			 && !acceptCondition(s[a[5]])) {
			cout << char('A' + a[1]-1) << char('A' + a[2]-1) << char('A' + a[3]-1) << char('A' + a[4]-1) << char('A' + a[5]-1) << endl;
			ans++;
		}
	} while (next_permutation(a + 1, a + 6));
	cout << ans;
	return 0;
}

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值