#include <bits/stdc++.h>
using namespace std;
#define endl '\n'
#define int long long int
int n, c[4][30], a[30],v[30];
void dfs(int x, int y, int t) {
//时间太长进行减枝操作
for (int i = 1; i <= n; i++) {
if (a[c[1][i]] > 0 && a[c[2][i]] > 0 && a[c[3][i]] > 0)
if ((a[c[1][i]] + a[c[2][i]]) % n != a[c[3][i]] &&
(a[c[1][i]] + a[c[2][i] ]+1) % n != a[c[3][i]])
return;
}
if (y > n) {
if(t==0)
for (int i = 0; i < n; i++) {
cout << a[i] << ' ';
}
return;
}//
int z = c[x][y];
if (x <= 2){
if (a[z] != -1) {
dfs(x + 1, y, t);
}
//
else {
for (int i = 0; i < n; i++) {
if (!v[i]) {
v[i] = 1;
a[z] = i;
dfs(x + 1, y, t);
v[i] = 0;
a[z] = -1;
}
}
}//
}
//if (x <= 2)搜索前两行,else搜索第三行
else {
t += a[c[1][y]] + a[c[2][y]];
if (a[z] != -1 && a[z] == t % n) {
dfs(1, y + 1, t / n);
}
if (a[z] == -1&&v[t%n]==0) {
a[z] = t % n;
v[t % n] = 1;
dfs(1, y + 1, t / n);
a[z] = -1;
v[t % n] = 0;
}
}
}
signed main() {
memset(a, -1, sizeof(a));
cin >> n;
for (int i = 1; i <= 3; i++) {
for (int j = n; j >= 1; j--) {
char t; cin >> t;
c[i][j] = t - 'A';
}
}
dfs(1, 1, 0);
return 0;
}
P1092 [NOIP2004 提高组] 虫食算
最新推荐文章于 2024-09-29 22:47:13 发布