1 /*这个题目需要注意的细节很多,尤其是jw[k]==0的回溯一定不能忘记*/
2 #include<iostream>
3 using namespace std;
4 #include<cstdio>
5 #include<cstring>
6 #include<cstdlib>
7 int atos[‘Z‘+1];
8 char jz[4][30];
9 bool flag[30]={0};
10 int n;
11 int jw[30]={0};
12 void dfs(int k,int p)
13 {
14 for(int i=1;i<=n;++i)
15 {
16 if(atos[jz[1][i]]>=0&&atos[jz[2][i]]>=0&&atos[jz[3][i]]>=0)
17 {
18 int p=atos[jz[1][i]]+atos[jz[2][i]];
19 if(p%n!=atos[jz[3][i]]&&(p+1)%n!=atos[jz[3][i]])
20 return;
21 }
22 }
23 if(k<=0)
24 {
25 printf("%d",atos[‘A‘]);
26 for(int i=‘B‘;i<=‘A‘+n-1;++i)
27 printf(" %d",atos[i]);
28 printf("\n");
29 exit(0);
30 }
31 if(p==3)
32 {
33 int temp=atos[jz[1][k]]+atos[jz[2][k]]+jw[k+1];
34 if(atos[jz[3][k]]>=0)
35 {
36 if(atos[jz[3][k]]==temp)
37 {
38 dfs(k-1,1);
39 }
40 else if(atos[jz[3][k]]+n==temp)
41 {
42 jw[k]=1;
43 dfs(k-1,1);
44 jw[k]=0;
45 }else return;
46 }
47 else
48 {
49 if(temp>=n)
50 {
51 jw[k]=1;
52 temp-=n;
53 }
54 if(!flag[temp])
55 {
56 flag[temp]=true;
57 atos[jz[3][k]]=temp;
58 dfs(k-1,1);
59 flag[temp]=false;
60 atos[jz[3][k]]=-1;
61 }
62 jw[k]=0;/*前面一开始写了一个if(flag[temp]) return 结果jw没被重置,倒数第二组数据,就错了*/
63 }
64
65 }else if(p==2)
66 {
67 if(atos[jz[2][k]]>=0)
68 {
69 dfs(k,3);
70 }
71 else {
72 for(int j=0;j<=n-1;++j)
73 {
74 if(!flag[j])
75 {
76 flag[j]=true;
77 atos[jz[2][k]]=j;
78 dfs(k,3);
79 flag[j]=false;
80 atos[jz[2][k]]=-1;
81 }
82 }
83 }
84 }
85 else if(p==1)
86 {
87 if(atos[jz[1][k]]>=0)
88 {
89 dfs(k,2);
90 }
91 else {
92 for(int j=0;j<=n-1;++j)
93 {
94 if(!flag[j])
95 {
96 flag[j]=true;
97 atos[jz[1][k]]=j;
98 dfs(k,2);
99 flag[j]=false;
100 atos[jz[1][k]]=-1;
101 }
102 }
103 }
104 }
105 }
106 int main()
107 {
108 scanf("%d",&n);
109 for(int i=1;i<=3;++i)
110 scanf("%s",jz[i]+1);
111 memset(atos,-1,sizeof(atos));
112 dfs(n,1);
113 return 0;
114 }