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;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现