简单分讨求调,WA 一个点
查看原帖
简单分讨求调,WA 一个点
377873
EricWan楼主2024/9/16 18:17

救一救,我那个点输出无解,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;
}
2024/9/16 18:17
加载中...