1 #include <cstdio> 2 #include <cstring> 3 #include <cstdlib> 4 char a[4][28]; 5 bool vix[100],vi[28]; 6 int c[100],ge=1,an[100],t; 7 bool judge1() 8 { 9 char x,y,z; 10 for(int i=t;i>0;i--) 11 { 12 x=a[1][i];y=a[2][i];z=a[3][i]; 13 if(an[x]!=-1&&an[y]!=-1&&an[z]!=-1&&(an[x]+an[y])%t!=an[z]&&(an[x]+an[y]+1)%t!=an[z]) 14 return false; 15 } 16 return true; 17 } 18 bool judge2() 19 { 20 char x,y,z; 21 int jin=0; 22 for(int i=t;i>0;i--) 23 { 24 x=a[1][i];y=a[2][i];z=a[3][i]; 25 jin=jin+an[x]+an[y]; 26 if(jin%t!=an[z]) 27 return false; 28 jin/=t; 29 } 30 return true; 31 } 32 void dfs(int x) 33 { 34 int z=c[x]; 35 if(!judge1()) 36 return; 37 if(x>t) 38 { 39 if(judge2()) 40 { 41 for(int i=0;i<t;i++) 42 { 43 if(i) 44 printf(" "); 45 printf("%d",an[‘A‘+i]); 46 47 } 48 exit(0); 49 } 50 else 51 return; 52 } 53 54 else 55 { 56 for(int i=t-1;i>=0;i--) 57 if(!vi[i]) 58 { 59 vi[i]=true; 60 an[z]=i; 61 dfs(x+1); 62 an[z]=-1; 63 vi[i]=false; 64 } 65 } 66 } 67 int main() 68 { 69 scanf("%d",&t); 70 int i,j; 71 memset(an,-1,sizeof(an)); 72 for(i=1;i<=3;i++) 73 scanf("%s",a[i]+1); 74 for(i=t;i>0;i--) 75 for(j=1;j<4;j++) 76 if(!vix[a[j][i]]) 77 { 78 vix[a[j][i]]=true; 79 c[ge++]=a[j][i]; 80 } 81 dfs(1); 82 return 0; 83 }
剪枝重要性的完美体现。
从各位开始扫,找到唯一的正确答案就exit(0)
时间: 2024-10-28 06:45:23