模拟+dfs#9TLE求调
查看原帖
模拟+dfs#9TLE求调
992080
Divinsword_Liao楼主2023/11/18 10:20

这是用了模拟算法,模拟人的解题方式

(瞅了一眼题解)发现我基本上写出了所有模拟能用的剪枝

dfs 直接Ctrl+C 然后Ctrl+V 长度达到了近5k

注释是我怕写着写着就忘了怎么写的加的,有点多
#include <bits/stdc++.h>
using namespace std;
char c[6][30];
int a[128], n;
bool ok, use[200];
inline void dfs (int s, int mod)	// s means right to left, mod means add 1
{
	if (s == 0)
	{
		if (mod > 0) return;
		for (int i = 'A'; i < 'A' + n; i ++)
			cout << a[i] << ' ';
		cout << endl;
		ok = 1;
		exit(0);
	}	//find answers
	if (a[c[1][s]] == - 1 && a[c[2][s]] == - 1 && a[c[3][s]] == - 1)
	{
		for (int i = 0; i < n; i ++)
			if (!use[i])	//not used
			{
				a[c[1][s]] = i;	use[i] = 1;
				if (a[c[2][s]] == - 1)
				{
					for (int j = 0; j < n; j ++)
						if (!use[j])
						{
							a[c[2][s]] = j;	use[j] = 1;
							if (a[c[3][s]] == - 1)
								if (!use[(i + j + mod) % n])
									a[c[3][s]] = (i + j + mod) % n, use[(i + j + mod) % n] = 1;
							if (a[c[3][s]] != - 1 && (a[c[1][s]] + a[c[2][s]] + mod) % n == a[c[3][s]])
								dfs (s - 1, (i + j + mod >= n ? 1 : 0));
							a[c[2][s]] = - 1;	use[j] = 0;
							if (a[c[3][s]] != - 1)
								use[a[c[3][s]]] = 0, a[c[3][s]] = - 1;
							if (ok) return;
						}
				}
				else
				{
					if (a[c[3][s]] == - 1 && !use[(i + a[c[2][s]] + mod) % n])
						a[c[3][s]] = (i + a[c[2][s]] + mod) % n, use[(i + a[c[2][s]] + mod) % n] = 1;
					if (a[c[3][s]] != - 1 && (a[c[1][s]] + a[c[2][s]] + mod) % n == a[c[3][s]])
						dfs (s - 1, (i + a[c[2][s]] + mod >= n ? 1 : 0));
					if (a[c[3][s]] != - 1)
						use[a[c[3][s]]] = 0, a[c[3][s]] = - 1;
					if (ok) return;
				}	// may c[1][s] == c[2][s]
				a[c[1][s]] =  - 1;	use[i] = 0;
				if (ok) return;
			}
		return;
	}	//first situation : three letter aren't used
	if (a[c[1][s]] == - 1 && a[c[2][s]] == - 1)
	{
		for (int i = 0; i < n; i ++)
			if (!use[i])
			{
				a[c[1][s]] = i;	use[i] = 1;
				if (a[c[2][s]] == - 1 && !use[(a[c[3][s]] - i - mod + n) % n])
					a[c[2][s]] = (a[c[3][s]] - i - mod + n) % n, use[(a[c[3][s]] - i - mod + n) % n] = 1;
				if (a[c[2][s]] != - 1 && (a[c[1][s]] + a[c[2][s]] + mod) % n == a[c[3][s]])
					dfs (s - 1, (i + a[c[2][s]] + mod >= n ? 1 : 0));	//don't forget add mod!
				a[c[1][s]] = - 1, use[i] = 0;
				if (a[c[2][s]] != - 1)
					use[a[c[2][s]]] = 0, a[c[2][s]] = - 1;
				if (ok) return;
			}
		return;
	}	//second situation : the third letter is used
	if (a[c[1][s]] == - 1 && a[c[3][s]] == - 1)
	{
		for (int i = 0; i < n; i ++)
			if (!use[i])
			{
				a[c[1][s]] = i;	use[i] = 1;
				if (a[c[3][s]] == - 1 && !use[(i + a[c[2][s]] + mod) % n])
					a[c[3][s]] = (i + a[c[2][s]] + mod) % n, use[(i + a[c[2][s]] + mod) % n] = 1;
				if (a[c[3][s]] != - 1 && (a[c[1][s]] + a[c[2][s]] + mod) % n == a[c[3][s]])
					dfs (s - 1, (i + a[c[2][s]] + mod >= n ? 1 : 0));	// add mod!
				a[c[1][s]] = - 1, use[i] = 0;
				if (a[c[3][s]] != - 1)
					use[a[c[3][s]]] = 0, a[c[3][s]] = - 1;
				if (ok) return;
			}
		return;
	}	// third situation : the second letter is used
	if (a[c[2][s]] == - 1 && a[c[3][s]] == - 1)
	{
		for (int i = 0; i < n; i ++)
			if (!use[i])
			{
				a[c[2][s]] = i;	use[i] = 1;
				if (a[c[3][s]] == - 1 && !use[(i + a[c[1][s]] + mod) % n])
					a[c[3][s]] = (i + a[c[1][s]] + mod) % n, use[(i + a[c[1][s]] + mod) % n] = 1;
				if (a[c[3][s]] != - 1 && (a[c[1][s]] + a[c[2][s]] + mod) % n == a[c[3][s]])
					dfs (s - 1, (i + a[c[1][s]] + mod >= n ? 1 : 0));	//add mod!
				a[c[2][s]] = - 1, use[i] = 0;
				if (a[c[3][s]] != - 1)
					use[a[c[3][s]]] = 0, a[c[3][s]] = - 1;
				if (ok) return;
			}
		return;
	}	// forth situation : the third letter is used
	if (a[c[1][s]] == - 1)
	{
		int now = (a[c[3][s]] - a[c[2][s]] - mod + n) % n;
		if (!use[now])
		{
			a[c[1][s]] = now;
			use[now] = 1;
			dfs (s - 1, (a[c[1][s]] + a[c[2][s]] + mod >= n ? 1 : 0));	// add mod!
			use[now] = 0;
			a[c[1][s]] = - 1;
		}
		return;
	}	// fifth situation : only first letter isn't used
	if (a[c[2][s]] == - 1)
	{
		int now = (a[c[3][s]] - a[c[1][s]] - mod + n) % n;
		if (!use[now])
		{
			a[c[2][s]] = now;
			use[now] = 1;
			dfs (s - 1, (a[c[1][s]] + a[c[2][s]] + mod >= n ? 1 : 0));	// add mod!
			use[now] = 0;
			a[c[2][s]] = - 1;
		}
		return;
	}	// sixth situation : only second letter isn't used
	if (a[c[3][s]] == - 1)
	{
		int now = (a[c[1][s]] + a[c[2][s]] + mod) % n;
		if (!use[now])
		{
			a[c[3][s]] = now;
			use[now] = 1;
			dfs (s - 1, (a[c[1][s]] + a[c[2][s]] + mod >= n ? 1 : 0));	// add mod!
			use[now] = 0;
			a[c[3][s]] = - 1;
		}
		return;
	}	// seventh situaion : only third letter isn't used
	if ((a[c[1][s]] + a[c[2][s]] + mod) % n == a[c[3][s]])
		dfs (s - 1, (a[c[1][s]] + a[c[2][s]] + mod >= n ? 1 : 0));	// add mod!
	// eighth situation and it's the last situation : all letters in this group are used
	return;
}
int main()
{
	cin >> n;
	memset (a, - 1, sizeof (a));
	for (int i = 1; i <= 3; i ++)
		for (int j = 1; j <= n; j ++)
			cin >> c[i][j];
	dfs (n, 0);
	exit(0);
}

大佬求调!

2023/11/18 10:20
加载中...