校田径运动会上A、B、C、D、E5人分获百米、四百米行跳高、跳远和三级跳冠军。
观众甲说:B获三级跳冠军,D获跳高冠军
观众乙说: A获百米冠军,E获跳高冠军
观众丙说: C获跳远冠军,D获四百米
冠军观众丁说: B获跳高冠军,E获三级跳冠军
实际情况是每人说对一句,说错一句。请编程求出哪项冠军。(I5分)
思路:for循环遍历所有条件,用三个map来记录用过的防止重复和冲突,最后记录可以的条件输出缺少的一一匹配即可具体代码如下:
#include<bits/stdc++.h>
using namespace std;
map<int,int>A;
map<char,string>ans;
map<int,int>B;
map<int,int>G;
string s[6] ;
int book[10];
void judge(int i, int j,int z,int h) {
if(i == 1) {
ans['B'] = "三级跳冠军";book[5] = 1;
}else {
ans['D'] = "跳高冠军";book[3] = 1;
}
if(j == 1) {
ans['A'] = "百米冠军";book[1] = 1;
}else {
ans['E'] = "跳高冠军";book[3] = 1;
}
if(z == 1) {
ans['C'] = "跳远冠军";book[4] = 1;
}else {
ans['D'] = "四百米";book[2] = 1;
}
if(h == 1) {
ans['B'] = "跳高冠军";book[3] = 1;
}else {
ans['E'] = "三级跳冠军";book[5] = 1;
}
for(int i = 0;i < 5;++i) {
if(ans[i+'A'] == "") {
for(int j = 1;j <= 5;++j) {
if(book[j] == 0) {
cout << char(i+'A') << "获" << s[j] << '\n';break;
}
}
}
else {
cout << char(i+'A') << "获" << ans[i+'A'] << '\n';
}
}
cout << "------------------------" << endl;
}
int main(){
s[1] = "百米冠军";
s[2] = "四百米冠军";
s[3] = "跳高冠军";
s[4] = "跳远冠军";
s[5] = "三级跳冠军";
for(int i = 0;i <= 1;++i) {
for(int j = 0;j <= 1;++j) {
for(int z = 0;z <= 1;++z) {
for(int h = 0;h <= 1;++h) {
int flag = 0;
if(i) {
if(A[5] == 1 || B[2] == 1) {
flag = 1;
}
A[5] = 1;
B[2] = 1;
G[5] = 2;
}else {
if(A[3] == 1 || B[4] == 1) {
flag = 1;
}
A[3] = 1;
B[4] = 1;
G[3] = 4;
}
if(j) {
if(A[1] == 1 || B[1] == 1) {
flag = 1;
}
A[1] = 1;
B[1] = 1;
G[1] = 1;
}else {
if(A[3] == 1 || B[5] == 1) {
flag = 1;
}
A[3] = 1;
B[5] = 1;
G[3] = 5;
}
if(z) {
if(A[4] == 1 || B[3] == 1) {
flag = 1;
}
A[4] = 1;
B[3] = 1;
G[4] = 3;
}else {
if(A[2] == 1 || B[4] == 1) {
flag = 1;
}
A[2] = 1;
B[4] = 1;
G[2] = 4;
}
if(h) {
if(A[3] == 1 || B[2] == 1) {
flag = 1;
}
A[3] = 1;
B[2] = 1;
G[3] = 2;
}else {
if(A[5] == 1 || B[5] == 1) {
flag = 1;
}
A[5] = 1;
B[5] = 1;
G[5] = 5;
}
//fen
if(i) {
if(G[4] == 3) {
flag = 1;
}
}else {
if(G[2] == 5) {
flag = 1;
}
}
if(j) {
if(G[5] == 3) {
flag = 1;
}
}else {
if(G[1] == 1) {
flag = 1;
}
}
if(z) {
if(G[4] == 2) {
flag = 1;
}
}else {
if(G[3] == 4) {
flag = 1;
}
}
if(h) {
if(G[5] == 5) {
flag = 1;
}
}else {
if(G[2] == 3) {
flag = 1;
}
}
if(flag == 0) {
judge(i, j, z, h);
}
A[1] = 0, A[2] = 0,A[3] = 0, A[4] = 0,A[5] = 0;
B[1] = 0, B[2] = 0,B[3] = 0, B[4] = 0,B[5] = 0;
}
}
}
}
return 0;
}
简单方法
#include<bits/stdc++.h>
using namespace std;
int book[10];
int main() {
for (int A = 1; A <= 5; ++A) {
for (int B = 1; B <= 5; ++B) {
for(int C = 1;C <= 5;++C) {
for(int D = 1;D <= 5;++D) {
for(int E = 1;E <= 5;++E) {
memset(book,0, sizeof(book));
if(book[A] == 0) {
book[A] = 1;
}
else {
continue;
}
if(book[B] == 0) {
book[B]= 1;
}
else {
continue;
}
if(book[C] == 0) {
book[C]= 1;
}
else {
continue;
}
if(book[D] == 0) {
book[D]= 1;
}
else {
continue;
}
if(book[E] == 0) {
book[E]= 1;
}
else {
continue;
}
bool h1 = (B == 5 && D != 3) || (B != 5 && D == 3);
bool h2 = (A == 1 && E != 3) || (A != 1 && E == 3);
bool h3 = (C == 4 && D != 2) || (C != 4 && D == 2);
bool h4 = (B == 3 && E != 5) || (B != 3 && E == 5);
if(h1 && h2 && h3 && h4) {
cout << A << B << C << D << E << '\n';
}
}
}
}
}
}
return 0;
}