P1092 [NOIP2004 提高组] 虫食算
给定的进制n,枚举各个字母代表的数字
->从右往左搜索 + 便搜遍判断
->dep==n+1 判断+输出
->dfs 时 低位的数字较大
>>>dfs 顺序+剪芝
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<bits/stdc++.h> #define ll long long #define ddd printf("-----------------debug\n"); using namespace std; int n,used[100],ans[100],p[100],tmp_use[100],cnt=0; char a[100],b[100],c[100]; int ok2() { for(int i=n;i>=1;i--) { if(ans[a[i]-'A'+1]==-1 ||ans[b[i]-'A'+1]==-1||ans[c[i]-'A'+1]==-1) continue; if( (ans[a[i]-'A'+1]+ans[b[i]-'A'+1]) %n != ans[c[i]-'A'+1] && (ans[a[i]-'A'+1]+ans[b[i]-'A'+1]+1 )%n != ans[c[i]-'A'+1]) return 0; } return 1; } void ok1() { int jw=0; for(int i=n;i>=1;i--) { int s=ans[a[i]-'A'+1]+ans[b[i]-'A'+1]+jw; if(s%n!=ans[c[i]-'A'+1]) return; jw=s/n; } for(int i=1;i<=n;i++) cout<<ans[i]<<" "; cout<<endl; exit(0); } void dfs(int dep) { if(dep>=n+1) { //ddd ok1(); return; } for(int i=n-1;i>=0;i--) //高位 数值较低 { if(used[i]) continue; ans[p[dep]]=i; used[i]=1; if(ok2()) { dfs(dep+1); ans[p[dep]]=-1; used[i]=0; } else used[i]=0,ans[p[dep]]=-1; } } int main() { ios::sync_with_stdio(false); memset(ans,-1,sizeof(ans)); cin>>n; cin>>a+1>>b+1>>c+1; // cout<<a+1<<endl; for(int i=n;i>=1;i--) { if(tmp_use[a[i]-'A'+1]==0) p[++cnt]=a[i]-'A'+1,tmp_use[a[i]-'A'+1]=1; if(tmp_use[b[i]-'A'+1]==0) p[++cnt]=b[i]-'A'+1,tmp_use[b[i]-'A'+1]=1; if(tmp_use[c[i]-'A'+1]==0) p[++cnt]=c[i]-'A'+1,tmp_use[c[i]-'A'+1]=1; } dfs(1); return 0; }

浙公网安备 33010602011771号