题目大意
一道很简单的dfs题,只是剪枝方面的要求很高,还有输出完答案要用exit(0)强行跳出,不然会tle
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<vector>
using namespace std;
int a[5][30];
int vis[30];
int ans[30];
int n;
vector<int>v;
void dfs(int loc){
if(ans[a[0][0]]+ans[a[1][0]]>=n){
return ;
}
if(loc==n){
int wei=0;
for(int i=n-1;i>=0;i--){
int x=ans[a[0][i]],y=ans[a[1][i]],z=ans[a[2][i]];
if((x+y+wei)%n!=z){
return;
}
if(x+y+wei<n){
wei=0;
}else{
wei=1;
}
}
for(int i=0;i<n;i++){
cout<<ans[i]<<" ";
}
cout<<endl;
exit(0);
return ;
}
for(int i=n-1;i>=0;i--){
int x=ans[a[0][i]],y=ans[a[1][i]],z=ans[a[2][i]];
if(x!=-1&&y!=-1&&z!=-1){
if((x+y)%n!=z&&(x+y+1)%n!=z){
return ;
}
}
}
for(int i=n-1;i>=0;i--){
if(!vis[i]){
ans[v[loc]]=i;
vis[i]=1;
dfs(loc+1);
ans[v[loc]]=-1;
vis[i]=0;
}
}
}
int main(){
cin>>n;
memset(vis,0,sizeof(vis));
memset(ans,-1,sizeof(ans));
char c;
for(int i=0;i<3;i++){
for(int j=0;j<n;j++){
cin>>c;
a[i][j]=c-'A';
}
}
for(int i=n-1;i>=0;i--){
if(vis[a[0][i]]==0){
v.push_back(a[0][i]);
vis[a[0][i]]=1;
}
if(vis[a[1][i]]==0){
v.push_back(a[1][i]);
vis[a[1][i]]=1;
}
if(vis[a[2][i]]==0){
v.push_back(a[2][i]);
vis[a[2][i]]=1;
}
}
memset(vis,0,sizeof(vis));
dfs(0);
}