#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;
}