1 条题解
-
0
C++ :
#include<iostream> #include<cstdio> #include<cstring> using namespace std; int n,zm[30],c[5][31]; char c1; bool f[30],F; bool jc() { int p=0; for(int i=n-1;i>=0;--i) { if (zm[c[1][i]]==-1||zm[c[2][i]]==-1||zm[c[3][i]]==-1)return false; int x=zm[c[1][i]]+zm[c[2][i]]+p; if(x%n!=zm[c[3][i]])return true; p=x/n; } return false; } bool jc2() { for(int i=n-1;i>=0;--i)//a+b?c if(zm[c[1][i]]!=-1&&zm[c[2][i]]!=-1&&zm[c[3][i]]!=-1) { int x=(zm[c[1][i]]+zm[c[2][i]])%n; if(!(x%n==zm[c[3][i]]||(x+1)%n==zm[c[3][i]]))return true; } for(int i=n-1;i>=0;--i)//a+?=c if(zm[c[1][i]]!=-1&&zm[c[2][i]]==-1&&zm[c[3][i]]!=-1) { int x=(zm[c[3][i]]-zm[c[1][i]]+n)%n; if(f[x]&&f[(x-1)%n])return true; } for(int i=n-1;i>=0;--i)//?+b=c if(zm[c[1][i]]==-1&&zm[c[2][i]]!=-1&&zm[c[3][i]]!=-1) { int x=(zm[c[3][i]]-zm[c[2][i]]+n)%n; if(f[x]&&f[(x-1)%n])return true; } for(int i=n-1;i>=0;--i)//a+b=? if(zm[c[1][i]]!=-1&&zm[c[2][i]]!=-1&&zm[c[3][i]]==-1) { int x=(zm[c[1][i]]+zm[c[2][i]])%n; if(f[x]&&f[(x+1)%n])return true; } return false; } void work(int k,int w) { if(F)return; if(jc())return; if(jc2())return; //if(zm[c[1][0]-65]+zm[c[2][0]-65]>n)return; if(k==0&&w==3) { for(int i=0;i<n-1;++i)printf("%d ",zm[i]); printf("%d\n",zm[n-1]);F=true;return; } if(zm[c[w][k]]!=-1) { if(w==3){w=1;--k;}else ++w; work(k,w); if(w==1){w=3;++k;}else --w; } else { for(int i=n-1;i>=0;--i) if(!f[i]) { zm[c[w][k]]=i,f[i]=true; if(w==3){w=1;--k;}else ++w; work(k,w); if(w==1){w=3;++k;}else --w; zm[c[w][k]]=-1;f[i]=false; } } } int main() { memset(c,0,sizeof(c)); scanf("%d",&n); for(int i=1;i<=3;++i) for(int j=0;j<n;++j) {cin>>c1;c[i][j]=c1-65;} F=false; memset(f,0,sizeof(f)); for(int i=0;i<n;++i)zm[i]=-1; work(n-1,1); return 0; }
- 1
信息
- ID
- 1096
- 时间
- 1000ms
- 内存
- 125MiB
- 难度
- (无)
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者