rt 我真的不知道还有哪里可以剪枝了
#include<bits/stdc++.h>
#define Code using
#define by namespace
#define wjb std
Code by wjb;
int n,ans[30];
string x[3];
bool f[3][30],used[30];
void dfs(int s,int d)
{
if(s==(-1))
{
for(int i=0;i<n-1;i++)cout<<ans[i]<<" ";
cout<<ans[n-1],exit(0);
}
int v[3]={x[0][s]-'A',x[1][s]-'A',x[2][s]-'A'};
if(f[0][s]&&f[1][s]&&f[2][s])
{
if((ans[v[0]]+ans[v[1]]+d)%n==ans[v[2]])dfs(s-1,(ans[v[0]]+ans[v[1]]+d)/n);
return;
}
for(int u=0;u<3;u++)
if(!f[u][s])
{
if(ans[v[u]]!=(-1))f[u][s]=true,dfs(s,d),f[u][s]=false;
else
{
if(u==0&&ans[v[1]]!=(-1)&&ans[v[2]]!=(-1))//这是剪枝
{
if(used[(ans[v[2]]-ans[v[1]]-d+n)%n])return;
f[u][s]=true,ans[v[u]]=(ans[v[2]]-ans[v[1]]-d+n)%n,used[(ans[v[2]]-ans[v[1]]-d+n)%n]=true;
dfs(s,d);
f[u][s]=false,ans[v[u]]=(-1),used[(ans[v[2]]-ans[v[1]]-d+n)%n]=false;
}
else if(u==1&&ans[v[2]]!=(-1))
{
if(used[(ans[v[2]]-ans[v[0]]-d+n)%n])return;
f[u][s]=true,ans[v[u]]=(ans[v[2]]-ans[v[0]]-d+n)%n,used[(ans[v[2]]-ans[v[0]]-d+n)%n]=true;
dfs(s,d);
f[u][s]=false,ans[v[u]]=(-1),used[(ans[v[2]]-ans[v[0]]-d+n)%n]=false;
}
else if(u==2)
{
if(used[(ans[v[0]]+ans[v[1]]+d)%n])return;
f[u][s]=true,ans[v[u]]=(ans[v[0]]+ans[v[1]]+d)%n,used[(ans[v[0]]+ans[v[1]]+d)%n]=true;
dfs(s-1,(ans[v[0]]+ans[v[1]]+d)/n);
f[u][s]=false,ans[v[u]]=(-1),used[(ans[v[0]]+ans[v[1]]+d)%n]=false;
}
else for(int i=n-1;i>=0;i--)
if(!used[i])
{
f[u][s]=true,ans[v[u]]=i,used[i]=true;
dfs(s,d);
f[u][s]=false,ans[v[u]]=(-1),used[i]=false;
}
}
return;
}
}
int main()
{
cin>>n>>x[0]>>x[1]>>x[2];
for(int i=0;i<n;i++)ans[i]=(-1);
dfs(n-1,0);
return 0;
}