救一救,我那个点输出无解,hack 放楼下。
#include <bits/stdc++.h>
// #define int __int128
#define MAXN 30
using namespace std;
int n, a[MAXN], b[MAXN], c[MAXN], num[MAXN], up[MAXN], used[MAXN];
void dfs(int i)
{
// cout << (long long)i << ": ";
// for (int i = 1; i <= n; i++)
// {
// cout << (long long)num[i] << "\t";
// }
// cout << endl;
if (i > n)
{
if (up[n] == 1)
{
return;
}
__int128 A = 0, B = 0, C = 0;
for (int i = 1; i <= n; i++)
{
A = A * n + num[a[i]];
}
for (int i = 1; i <= n; i++)
{
B = B * n + num[b[i]];
}
for (int i = 1; i <= n; i++)
{
C = C * n + num[c[i]];
}
if (A + B != C)
{
return;
}
for (int i = 1; i <= n; i++)
{
cout << (long long)(num[i]) << " ";
}
exit(0);
}
int nownum[MAXN], nowused[MAXN];
memcpy(nownum, num, sizeof(num));
memcpy(nowused, used, sizeof(used));
for (int A = 0; A < n; A++)
{
if (num[a[i]] + 1)
{
A = num[a[i]];
}
for (int B = 0; B < n; B++)
{
int C = A + B - n * up[i - 1];
if (C < 0 || C >= n)
{
goto SEC;
}
if (num[a[i]] + 1 && A != num[a[i]])
{
goto SEC;
}
if (num[b[i]] + 1 && B != num[b[i]])
{
goto SEC;
}
if (num[c[i]] + 1 && C != num[c[i]])
{
goto SEC;
}
if (num[a[i]] == -1 && used[A])
{
goto SEC;
}
if (num[b[i]] == -1 && used[B])
{
goto SEC;
}
if (num[c[i]] == -1 && used[C])
{
goto SEC;
}
used[A] = true;
used[B] = true;
used[C] = true;
num[a[i]] = A;
num[b[i]] = B;
num[c[i]] = C;
dfs(i + 1);
used[A] = nowused[A];
used[B] = nowused[B];
used[C] = nowused[C];
num[a[i]] = nownum[a[i]];
num[b[i]] = nownum[b[i]];
num[c[i]] = nownum[c[i]];
SEC:
C = A + B - n * up[i - 1] + 1;
if (C < 0 || C >= n)
{
continue;
}
if (num[a[i]] + 1 && A != num[a[i]])
{
continue;
}
if (num[b[i]] + 1 && B != num[b[i]])
{
continue;
}
if (num[c[i]] + 1 && C != num[c[i]])
{
continue;
}
if (num[a[i]] == -1 && used[A])
{
continue;
}
if (num[b[i]] == -1 && used[B])
{
continue;
}
if (num[c[i]] == -1 && used[C])
{
continue;
}
used[A] = true;
used[B] = true;
used[C] = true;
num[a[i]] = A;
num[b[i]] = B;
num[c[i]] = C;
up[i] = 1;
dfs(i + 1);
used[A] = nowused[A];
used[B] = nowused[B];
used[C] = nowused[C];
num[a[i]] = nownum[a[i]];
num[b[i]] = nownum[b[i]];
num[c[i]] = nownum[c[i]];
up[i] = 0;
}
if (num[a[i]] + 1)
{
break;
}
}
}
signed main()
{
memset(num, -1, sizeof(num));
long long N_;
char C;
cin >> N_;
n = N_;
for (int i = 1; i <= n; i++)
{
cin >> C;
a[i] = C - 'A' + 1;
}
for (int i = 1; i <= n; i++)
{
cin >> C;
b[i] = C - 'A' + 1;
}
for (int i = 1; i <= n; i++)
{
cin >> C;
c[i] = C - 'A' + 1;
}
for (int i = 0; i < n; i++)
{
for (int j = 0; i + j < n; j++)
{
memset(used, 0, sizeof(used));
num[a[1]] = i;
num[b[1]] = j;
num[c[1]] = i + j;
used[i] = used[j] = used[i + j] = true;
up[1] = 0;
if (a[1] == b[1] && i != j) goto SEC;
if (a[1] == b[1] && i != i + j) goto SEC;
if (c[1] == b[1] && j != i + j) goto SEC;
if (a[1] != b[1] && i == j) goto SEC;
if (a[1] != b[1] && i == i + j) goto SEC;
if (c[1] != b[1] && j == i + j) goto SEC;
dfs(2);
SEC:;
if (i + j + 1 >= n) continue;
memset(used, 0, sizeof(used));
num[c[1]] = i + j + 1;
used[i] = used[j] = used[i + j + 1] = true;
up[1] = 1;
if (a[1] == b[1] && i != j) continue;
if (a[1] == b[1] && i != i + j + 1) continue;
if (c[1] == b[1] && j != i + j + 1) continue;
if (a[1] != b[1] && i == j) continue;
if (a[1] != b[1] && i == i + j + 1) continue;
if (c[1] != b[1] && j == i + j + 1) continue;
dfs(2);
}
}
return 0;
}