社区讨论
10pts求条
P1092[NOIP 2004 提高组] 虫食算参与者 2已保存回复 4
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 4 条
- 当前快照
- 1 份
- 快照标识符
- @mhizp7ai
- 此快照首次捕获于
- 2025/11/03 18:21 4 个月前
- 此快照最后确认于
- 2025/11/03 18:21 4 个月前
CPP
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define endl '\n'
#define MAXN 30
int n;
string p1;
string p2;
string res;
string order = "";
int lead[MAXN];
bool visited[MAXN];
void putout() {
for (int i = 0; i < n; ++i)
cout << lead[i] << ' ';
cout << endl;
}
void dfs(int u, int t) {
if (u < 0 && t == 0) {
putout();
exit(0);
}
int add1 = p1[u] - 'A';
int add2 = p2[u] - 'A';
int resc = res[u] - 'A';
for (int i = n - 1; i >= 0; --i) {
for (int j = n - 1; j >= 0; --j) {
for (int k = n - 1; k >= 0; --k) {
bool fi = visited[i];
bool fj = visited[j];
bool fk = visited[k];
int prei = i;
int prej = j;
int prek = k;
if (lead[add1] != -1) {
fi = false;
prei = lead[add1];
}
if (lead[add2] != -1) {
fj = false;
prej = lead[add2];
}
if (lead[resc] != -1) {
fk = false;
prek = lead[resc];
}
if (fi || fj || fk || i == j || j == k)
continue;
int temp = (prei + prej + t);
if (temp % n == prek) {
visited[i] = visited[j] = visited[k] = true;
lead[add1] = prei;
lead[add2] = prej;
lead[resc] = prek;
dfs(u - 1, temp / n);
if (!fi) {
lead[add1] = -1;
visited[i] = false;
}
if (!fj) {
lead[add2] = -1;
visited[j] = false;
}
if (!fk) {
lead[resc] = -1;
visited[k] = false;
}
}
}
}
}
// if (lead[add1] != -1 && lead[add2] != -1 && lead[resc] != -1) {
// int temp = (lead[add1] + lead[add2] + t);
// if (temp % n == lead[resc]) {
// dfs(u - 1, temp / n);
// }
// } else if (lead[add1] != -1 && lead[add2] != -1 && lead[resc] == -1) {
// for (int i = n - 1; i >= 0; --i) {
// if (visited[i])
// continue;
// int temp = (lead[add1] + lead[add2] + t);
// if (temp % n == i) {
// lead[resc] = i;
// visited[i] = true;
// dfs(u - 1, temp / n);
// lead[resc] = -1;
// vivited[i] = false;
// }
// }
// } else if (lead[add1] != -1 && lead[add2] == -1 && lead[resc] != -1) {
// for (int i = n - 1; i >= 0; --i) {
// if (visited[i])
// continue;
// int temp = (lead[add1] + i + t);
// if (temp % n == lead[resc]) {
// lead[add2] = i;
// visited[i] = true;
// dfs(u - 1, temp / n);
// lead[add2] = -1;
// vivited[i] = false;
// }
// }
// } else if (lead[add1] != -1 && lead[add2] == -1 && lead[resc] == -1) {
// for (int i = n - 1; i >= 0; --i) {//add2
// for (int j = n - 1; j >= 0; --j) {//resc
// if (visited[i] || visited[j] || i == j)
// continue;
// int temp = (lead[add1] + i + t);
// if (temp % n == j) {
// lead[add2] = i;
// lead[resc] = j;
// visited[j] = true;
// visited[i] = true;
// dfs(u - 1, temp / n);
// lead[add2] = -1;
// lead[resc] = -1;
// vivited[i] = false;
// visited[j] = false;
// }
// }
// }
// } else if (lead[add1] == -1 && lead[add2] != -1 && lead[resc] != -1) {
// for (int i = n - 1; i >= 0; --i) {//add1
// if (visited[i])
// continue;
// int temp = (i + lead[add2] + t);
// if (temp % n == lead[resc]) {
// lead[add1] = i;
// visited[i] = true;
// dfs(u - 1, temp / n);
// lead[add1] = -1;
// vivited[i] = false;
// }
// }
// } else if (lead[add1] == -1 && lead[add2] != -1 && lead[resc] != -1) {
// for (int i = n - 1; i >= 0; --i) {//add1
// if (visited[i])
// continue;
// int temp = (i + lead[add2] + t);
// if (temp % n == lead[resc]) {
// lead[add1] = i;
// visited[i] = true;
// dfs(u - 1, temp / n);
// lead[add1] = -1;
// vivited[i] = false;
// }
// }
// }
}
signed main() {
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin >> n;
cin >> p1 >> p2 >> res;
map<char, bool> vis;
for (int i = n - 1; i >= 0; --i) {
char curr;
curr = p1[i];
if (!vis[curr]) {
order += curr;
vis[curr] = true;
}
curr = p2[i];
if (!vis[curr]) {
order += curr;
vis[curr] = true;
}
}
for (int i = 0; i < MAXN; ++i)
lead[i] = -1;
dfs(n - 1, 0);
return 0;
}
回复
共 4 条回复,欢迎继续交流。
正在加载回复...