社区讨论

10pts求条

P1092[NOIP 2004 提高组] 虫食算参与者 2已保存回复 4

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
4 条
当前快照
1 份
快照标识符
@mhizp7ai
此快照首次捕获于
2025/11/03 18:21
4 个月前
此快照最后确认于
2025/11/03 18:21
4 个月前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;

#define int long long
#define endl '\n'
#define MAXN 30

int n;
string p1;
string p2;
string res;

string order = "";
int lead[MAXN];
bool visited[MAXN];

void putout() {
	for (int i = 0; i < n; ++i)
		cout << lead[i] << ' ';
	cout << endl;
}

void dfs(int u, int t) {
	
	if (u < 0 && t == 0) {
		putout();
		exit(0);
	}
	int add1 = p1[u] - 'A';
	int add2 = p2[u] - 'A';
	int resc = res[u] - 'A';
	for (int i = n - 1; i >= 0; --i) {
		for (int j = n - 1; j >= 0; --j) {
			for (int k = n - 1; k >= 0; --k) {
				bool fi = visited[i];
				bool fj = visited[j];
				bool fk = visited[k];
				int prei = i;
				int prej = j;
				int prek = k;
				if (lead[add1] != -1) {
					fi = false;
					prei = lead[add1];
				}
				if (lead[add2] != -1) {
					fj = false;
					prej = lead[add2];
				}
				if (lead[resc] != -1) {
					fk = false;
					prek = lead[resc];
				}
				if (fi || fj || fk || i == j || j == k)
					continue;
				int temp = (prei + prej + t);
				if (temp % n == prek) {
					visited[i] = visited[j] = visited[k] = true;
					lead[add1] = prei;
					lead[add2] = prej;
					lead[resc] = prek;
					dfs(u - 1, temp / n);
					if (!fi)	{
						lead[add1] = -1;
						visited[i] = false;
					}
					if (!fj) {
						lead[add2] = -1;
						visited[j] = false;
					}
					if (!fk) {
						lead[resc] = -1;
						visited[k] = false;
					}
				}
			}
		}
	}
//	if (lead[add1] != -1 && lead[add2] != -1 && lead[resc] != -1) {
//		int temp = (lead[add1] + lead[add2] + t);
//		if (temp % n == lead[resc]) {
//			dfs(u - 1, temp / n);
//		}
//	} else if (lead[add1] != -1 && lead[add2] != -1 && lead[resc] == -1) {
//		for (int i = n - 1; i >= 0; --i) {
//			if (visited[i])
//				continue;
//			int temp = (lead[add1] + lead[add2] + t);
//			if (temp % n == i) {
//				lead[resc] = i;
//				visited[i] = true;
//				dfs(u - 1, temp / n);
//				lead[resc] = -1;
//				vivited[i] = false;
//			}
//		}
//	} else if (lead[add1] != -1 && lead[add2] == -1 && lead[resc] != -1) {
//		for (int i = n - 1; i >= 0; --i) {
//			if (visited[i])
//				continue;
//			int temp = (lead[add1] + i + t);
//			if (temp % n == lead[resc]) {
//				lead[add2] = i;
//				visited[i] = true;
//				dfs(u - 1, temp / n);
//				lead[add2] = -1;
//				vivited[i] = false;
//			}
//		}
//	} else if (lead[add1] != -1 && lead[add2] == -1 && lead[resc] == -1) {
//		for (int i = n - 1; i >= 0; --i) {//add2
//			for (int j = n - 1; j >= 0; --j) {//resc
//				if (visited[i] || visited[j] || i == j)
//					continue;
//				int temp = (lead[add1] + i + t);
//				if (temp % n == j) {
//					lead[add2] = i;
//					lead[resc] = j;
//					visited[j] = true;
//					visited[i] = true;
//					dfs(u - 1, temp / n);
//					lead[add2] = -1;
//					lead[resc] = -1;
//					vivited[i] = false;
//					visited[j] = false;
//				}
//			}
//		}
//	} else if (lead[add1] == -1 && lead[add2] != -1 && lead[resc] != -1) {
//		for (int i = n - 1; i >= 0; --i) {//add1
//			if (visited[i])
//				continue;
//			int temp = (i + lead[add2] + t);
//			if (temp % n == lead[resc]) {
//				lead[add1] = i;
//				visited[i] = true;
//				dfs(u - 1, temp / n);
//				lead[add1] = -1;
//				vivited[i] = false;
//			}
//		}
//	} else if (lead[add1] == -1 && lead[add2] != -1 && lead[resc] != -1) {
//		for (int i = n - 1; i >= 0; --i) {//add1
//			if (visited[i])
//				continue;
//			int temp = (i + lead[add2] + t);
//			if (temp % n == lead[resc]) {
//				lead[add1] = i;
//				visited[i] = true;
//				dfs(u - 1, temp / n);
//				lead[add1] = -1;
//				vivited[i] = false;
//			}
//		}
//	}
}

signed main() {
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	
	cin >> n;
	cin >> p1 >> p2 >> res;
	
	map<char, bool> vis;
	for (int i = n - 1; i >= 0; --i) {
		char curr;
		curr = p1[i];
		if (!vis[curr]) {
			order += curr;
			vis[curr] = true;
		}
		curr = p2[i];
		if (!vis[curr]) {
			order += curr;
			vis[curr] = true;
		}
	}
	for (int i = 0; i < MAXN; ++i)
		lead[i] = -1;
	
	dfs(n - 1, 0);
	
	return 0;
} 

回复

4 条回复,欢迎继续交流。

正在加载回复...