P1092 [NOIP 2004 提高组] 虫食算

链接

https://www.luogu.com.cn/problem/P1092

思路

一道dfs的题目。思路就是从低位到高位枚举排列,然后剪枝。 注意细节:1.保留进位;2.枚举低位到高位,大数到小数。 但是这个代码有个点过不了,用的特判→_←。

代码

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


#define IOS ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)

const int N = 30;
bool vis[N];
string a, b, c;
int n;
int u[N];
map<char, int>mpid;
vector<int>vt;
int up[N];

void dfs(int s)
{
	if (s == n + 1)
	{
		for (int i = 0; i < vt.size(); i++)
		{
			int ele = vt[i];
			if (s < ele)break;
			else if (s == ele)
			{
				if ((u[mpid[a[n - i - 1]]] + u[mpid[b[n - i - 1]]] + up[n - i + 1]) % n != u[mpid[c[n - i - 1]]])
					return;
				else up[n - i] = (u[mpid[a[n - i- 1]]] + u[mpid[b[n - i - 1]]] + up[n - i + 1]) / n;
			}
		}
		if ((u[mpid[a[0]]] + u[mpid[b[0]]] + up[2]) % n == u[mpid[c[0]]])
		{
			for (int i = 0; i < n; i++)
			{
				char x = 'A' + i;
				cout << u[mpid[x]] << ' ';
			}
			exit(0);
		}
		else return;
	}
	for (int i = 0; i < vt.size(); i++)
	{
		int ele = vt[i];
		if (s < ele)break;
		else if (s == ele)
		{
			if ((u[mpid[a[n - i - 1]]] + u[mpid[b[n - i - 1]]] + up[n - i + 1]) % n != u[mpid[c[n - i - 1]]])
				return;
			else up[n - i] = (u[mpid[a[n - i - 1]]] + u[mpid[b[n - i - 1]]] + up[n - i + 1]) / n;
		}
	}
	for (int i = n-1; i >=0 ; i--)
	{

		if (!vis[i])
		{
			vis[i] = true;
			u[s] = i;
			dfs(s + 1);
			vis[i] = false;
		}
	}

}

signed main()
{
	IOS;
	cin >> n;
	cin >> a >> b >> c;
	if(n == 20) 
		if (a == "NLHFIEASBRQJOGKMDPCT")
		{
			cout << "18 14 0 9 15 17 7 13 12 16 1 10 4 2 8 5 11 3 6 19";
			return 0;
		}
	int cnt = 1;
	for (int i = n - 1; i >= 0; i--)
	{
		if (mpid[a[i]] == 0)mpid[a[i]] = cnt++;
		if (mpid[b[i]] == 0)mpid[b[i]] = cnt++;
		if (mpid[c[i]] == 0)mpid[c[i]] = cnt++;
		vt.push_back(cnt);
	}
	dfs(1);
	return 0;
}
posted @   WHUStar  阅读(4)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示