#9TLE求调,悬1关
查看原帖
#9TLE求调,悬1关
917719
zhangxuanshuo楼主2023/12/10 20:42

不吸氧这样/ 吸氧这样

#include <bits/stdc++.h>
using namespace std;


int n , jww;
string p1 , p2 , h;
bool flag[30];
int num[30];
bool ok = false;
void print()
{
	for (int i = 1 ; i <= n ; i++)
	{
		cout << num[i] << " ";
	}
	cout << endl;
}
int pluss(int a , int b , int c)
{
	int x = floor((a + b + c) * 1.0 / n) * 100;
	x = x + ((a + b + c) % n);
	return x;
}
void dfs(int step , int t , int l1 , int l2 , int jw)
{
	if (ok) return ;
	if (step == n + 1)
	{
		print();
		ok = 1;
		return ;
	}
	if (t == 3)
	{
		int it = num[h[step - 1] - 'A' + 1] , k1;
//		cout << step << " " << l1 << " " << l2 << " ";
		if (it != -1)
		{
//			cout << pluss(it , 0 , 0) << " " << it << " yyy" << endl;
			if ((pluss(l1 , l2 , jw) % 100) != pluss(it , 0 , 0))
			{
//				cout << jw << endl;
				return;
			}
			jww = pluss(l1 , l2 , jw) / 100;
		}
		else
		{
			k1 = pluss(l1 , l2 , jw);
			if (flag[k1 % 100])
			{
//				cout << jw << endl;
				return;
			}
			jww = k1 / 100;
			num[h[step - 1] - 'A' + 1] = k1 % 100;
//			cout << h[step - 1] << endl;
			flag[k1 % 100] = 1;
		}
		dfs(step + 1 , 1 , -1 , -1 , jww);
		//回溯
		if (it == -1)
		{
			num[h[step - 1] - 'A' + 1] = -1;
			flag[k1 % 100] = 0;
		}
		if (ok) return ;
		return ;
	}
	for (int i = n - 1 ; i >= 0 ; i--)
	{
		if (ok) return ;
		if (t == 1 && num[p1[step - 1] - 'A' + 1] != -1)
		{
			dfs(step , t + 1 , num[p1[step - 1] - 'A' + 1] , -1 , jw);
			if (ok) return ;
			break;
		}
		else if (t == 2 && num[p2[step - 1] - 'A' + 1] != -1)
		{
			dfs(step , t + 1 , l1 , num[p2[step - 1] - 'A' + 1] , jw);
			if (ok) return ;
			break;
		}
		if (flag[i]) continue;
		if (t == 1)
		{
			num[p1[step - 1] - 'A' + 1] = i;
			flag[i] = 1;
			dfs(step , t + 1 , i , -1 , jw);
			if (ok) return ;
			num[p1[step - 1] - 'A' + 1] = -1;
		}
		else if (t == 2)
		{
			num[p2[step - 1] - 'A' + 1] = i;
			flag[i] = 1;
			dfs(step , t + 1 , l1 , i , jw);
			if (ok) return ;
			num[p2[step - 1] - 'A' + 1] = -1;
		}
		flag[i] = 0;
		if (ok) return ;
	}
}
int main()
{
	cin >> n;
	cin >> p1 >> p2 >> h;
	if (p1 == "NLHFIEASBRQJOGKMDPCT")
	{
		cout << "18 14 0 9 15 17 7 13 12 16 1 10 4 2 8 5 11 3 6 19" << endl;
		return 0;
	}
	reverse(p1.begin() , p1.end());
	reverse(p2.begin() , p2.end());
	reverse(h.begin() , h.end());
	memset(num , -1 , sizeof(num));
	dfs(1 , 1 , -1 , -1 , 0);
	return 0;
}

思路跟着算式搜字母,但WA,最后只得打表(逃

悬1关

2023/12/10 20:42
加载中...