链接:https://www.luogu.org/problemnew/show/P1092
首先这题标算据说是高斯消元,但标签已经是搜索了。。。身为蒟蒻当然只会打搜索。而我的搜索又打的很翔,从右到左dfs搜过来,暴枚这一列三个数的情况,然后进位。注意枚举从大到小枚,因为第一位(最左边)不会进位,所以从右到左时从大到小会更好,不然会被卡tle一个点。。。
// luogu-judger-enable-o2
#include<bits/stdc++.h>
using namespace std;
int n,a1[30],a2[30],a3[30],to[30];
bool vis[30];
char s1[30],s2[30],s3[30];
void dfs(int pos,int jw)
{
if(pos==0)
{
for(int i=0;i<n;i++)
printf("%d ",to[i]);
exit(0);
}
int nw1=a1[pos],nw2=a2[pos],nw3=a3[pos],tmp,tp;
lb:
if(to[nw1]!=-1)
{
if(to[nw2]!=-1)
{
if(to[nw3]!=-1)
{
if((to[nw1]+to[nw2]+jw)%n!=to[nw3])return;
else dfs(pos-1,(to[nw1]+to[nw2]+jw)/n);
}
else
{
tmp=(to[nw1]+to[nw2]+jw)%n;
if(!vis[tmp])
{
to[nw3]=tmp;
vis[to[nw3]]=1;
dfs(pos-1,(to[nw1]+to[nw2]+jw)/n);
vis[to[nw3]]=0;
to[nw3]=-1;
}
}
}
else
{
if(to[nw3]!=-1)
{
tmp=to[nw3]-to[nw1]-jw;
if(tmp<0)tmp+=n;
if(!vis[tmp])
{
to[nw2]=tmp;
vis[to[nw2]]=1;
dfs(pos-1,(to[nw1]+to[nw2]+jw)/n);
vis[to[nw2]]=0;
to[nw2]=-1;
}
}
else
{
for(int i=n-1;i>=0;i--)
{
if(!vis[i])
{
to[nw2]=i,vis[i]=1;
tmp=(to[nw1]+to[nw2]+jw)%n;
if(!vis[tmp])
{
to[nw3]=tmp;
vis[to[nw3]]=1;
dfs(pos-1,(to[nw1]+to[nw2]+jw)/n);
vis[to[nw3]]=0;
to[nw3]=-1;
}
else if(nw2==nw3&&tmp==i)dfs(pos-1,(to[nw1]+to[nw2]+jw)/n);
to[nw2]=-1,vis[i]=0;
}
}
}
}
}
else
{
if(to[nw2]!=-1){swap(nw1,nw2);goto lb;}
else
{
if(to[nw3]!=-1)
{
for(int i=n-1;i>=0;i--)
{
if(!vis[i])
{
to[nw1]=i,vis[i]=1;
tmp=to[nw3]-to[nw1]-jw;
if(tmp<0)tmp+=n;
if(!vis[tmp])
{
to[nw2]=tmp;
vis[to[nw2]]=1;
dfs(pos-1,(to[nw1]+to[nw2]+jw)/n);
vis[to[nw2]]=0;
to[nw2]=-1;
}
else if(nw1==nw2&&i==tmp)dfs(pos-1,(to[nw1]+to[nw2]+jw)/n);
to[nw1]=-1,vis[i]=0;
}
}
}
else
{
for(int i=n-1;i>=0;i--)
{
if(!vis[i])
{
to[nw1]=i,vis[i]=1;
if(nw1==nw2)
{
tmp=(to[nw1]+to[nw2]+jw)%n;
if(!vis[tmp])
{
to[nw3]=tmp;
vis[to[nw3]]=1;
dfs(pos-1,(to[nw1]+to[nw2]+jw)/n);
vis[to[nw3]]=0;
to[nw3]=-1;
}
}
else
{
for(int j=n-1;j>=0;j--)
{
if(!vis[j])
{
to[nw2]=j,vis[j]=1;
tmp=(to[nw1]+to[nw2]+jw)%n;
if(!vis[tmp])
{
to[nw3]=tmp;
vis[to[nw3]]=1;
dfs(pos-1,(to[nw1]+to[nw2]+jw)/n);
vis[to[nw3]]=0;
to[nw3]=-1;
}
else if(nw3==nw1&&tmp==i)dfs(pos-1,(to[nw1]+to[nw2]+jw)/n);
else if(nw3==nw2&&tmp==j)dfs(pos-1,(to[nw1]+to[nw2]+jw)/n);
to[nw2]=-1,vis[j]=0;
}
}
}
to[nw1]=-1,vis[i]=0;
}
}
}
}
}
}
int main()
{
scanf("%d",&n);
scanf("%s",s1+1);
scanf("%s",s2+1);
scanf("%s",s3+1);
memset(to,-1,sizeof to);
for(int i=1;i<=n;i++)
{
a1[i]=s1[i]-'A';
a2[i]=s2[i]-'A';
a3[i]=s3[i]-'A';
}
dfs(n,0);
}