F题题解
逻辑大师
https://ac.nowcoder.com/acm/contest/76691/F
F题目题解
注意:每题只能选择一个选项,正确答案要保证这组解满足所有题目的限制条件。
对于一道题目可能会存在多个答案符合条件,但是我们只能选择一个。
对于最终的正确答案一定保证同时满足十个题目的限制条件。
因此此题非人力可为,只能用机器采取暴力搜索的办法。
暴力搜索十个题目的答案,时间复杂度为O(4^10)。
#include <bits/stdc++.h>
using namespace std;
#define endl "\n"
#define PII pair<int, int>
#define int long long
const int N = 1e6 + 10;
const int INF = 1e18;
vector<int> ans;
int book[5];
bool ans2() {
if (ans[2] == 1 && ans[5] == 3) return true;
if (ans[2] == 2 && ans[5] == 4) return true;
if (ans[2] == 3 && ans[5] == 1) return true;
if (ans[2] == 4 && ans[5] == 2) return true;
return false;
}
bool ans3() {
if (ans[3] == 1 && ans[3] - ans[6] && ans[3] - ans[2] && ans[3] - ans[4])
return true;
if (ans[3] == 2 && ans[6] - ans[3] && ans[6] - ans[2] && ans[6] - ans[4])
return true;
if (ans[3] == 3 && ans[2] - ans[3] && ans[2] - ans[6] && ans[2] - ans[4])
return true;
if (ans[3] == 4 && ans[4] - ans[3] && ans[4] - ans[6] && ans[4] - ans[2])
return true;
return false;
}
bool ans4() {
if (ans[4] == 1 && ans[1] == ans[5]) return true;
if (ans[4] == 2 && ans[2] == ans[7]) return true;
if (ans[4] == 3 && ans[1] == ans[9]) return true;
if (ans[4] == 4 && ans[6] == ans[10]) return true;
return false;
}
bool ans5() {
if (ans[5] == 1 && ans[8] == 1) return true;
if (ans[5] == 2 && ans[4] == 2) return true;
if (ans[5] == 3 && ans[9] == 3) return true;
if (ans[5] == 4 && ans[7] == 4) return true;
return false;
}
bool ans6() {
if (ans[6] == 1 && ans[8] == ans[2] && ans[8] == ans[4]) return true;
if (ans[6] == 2 && ans[8] == ans[1] && ans[8] == ans[6]) return true;
if (ans[6] == 3 && ans[8] == ans[3] && ans[8] == ans[10]) return true;
if (ans[6] == 4 && ans[8] == ans[5] && ans[8] == ans[9]) return true;
return false;
}
bool ans7() {
int mi = min({book[1], book[2], book[3], book[4]});
if (ans[7] == 1 && book[3] == mi) return true;
if (ans[7] == 2 && book[2] == mi) return true;
if (ans[7] == 3 && book[1] == mi) return true;
if (ans[7] == 4 && book[4] == mi) return true;
return false;
}
bool ans9() {
int da = (ans[1] == ans[6]);
if (ans[9] == 1) {
int da1 = (ans[6] == ans[5]);
if (da1 - da) return true;
}
if (ans[9] == 2) {
int da1 = (ans[10] == ans[5]);
if (da1 - da) return true;
}
if (ans[9] == 3) {
int da1 = (ans[2] == ans[5]);
if (da1 - da) return true;
}
if (ans[9] == 4) {
int da1 = (ans[9] == ans[5]);
if (da1 - da) return true;
}
return false;
}
bool ans10() {
int cha = max({book[1], book[2], book[3], book[4]}) -
min({book[1], book[2], book[3], book[4]});
if (ans[10] == 1 && cha == 2) return true;
if (ans[10] == 2 && cha == 4) return true;
if (ans[10] == 3 && cha == 3) return true;
if (ans[10] == 4 && cha == 1) return true;
return false;
}
void dfs() {
if (ans.size() == 11) {
if (ans2() && ans3() && ans4() && ans5() && ans6() && ans7() && ans9() &&
ans10()) {
for (int i = 1; i < ans.size(); i++) cout << char('A' + ans[i] - 1);
cout << endl;
}
return;
}
for (int i = 1; i <= 4; i++) {
ans.push_back(i);
book[i]++;
dfs();
book[i]--;
ans.pop_back();
}
}
void solve() {
ans.push_back(10);
dfs();
}
signed main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
int T = 1;
// cin>>T;
while (T--) solve();
return 0;
}