蜜汁。还不知道自己那种为什么不行。而且输入的奇怪错误?
dfs。
1.仅按列枚举两个加数,就能算出该位的得数;
2.从右往左枚举可以记录进位;
3.每确定一个值就把整个式子都跑一遍看看有没有不合法处。
对于得数是否合法的判断需要想好。合法的仅两种:都没赋值 或 都赋了值且值相等。
AC代码:
#include<iostream> #include<cstdio> #include<cstdlib> using namespace std; int n,map[300],jin[30]; char ch,a[5][30]; bool use[30],be[300]; void clear(int h,int l,int num) { map[a[h][l]]=0;use[num]=0;be[a[h][l]]=0; } void giv(int h,int l,int num) { map[a[h][l]]=num;use[num]=1;be[a[h][l]]=1; } bool check(int l,int num) { if((!be[a[3][l]]&&!use[num])||(be[a[3][l]]&&use[num]&&map[a[3][l]]==num))return 0; return 1; } bool checkk(int l) { for(int k=l;k>=0;k--) if(be[a[1][k]]&&be[a[2][k]]&&be[a[3][k]]) { int c=map[a[1][k]]+map[a[2][k]]; int c1=c%n,c2=(c+1)%n; if(map[a[3][k]]!=c1&&map[a[3][k]]!=c2)return 1; } return 0; } void dfs2(int h,int l) { // printf("(h=%d l=%d) ",h,l); if(l<0) { for(int i=65;i<=91;i++) if(be[i])printf("%d ",map[i]); exit(0); } if(checkk(l))return; if(h==3) { int c=map[a[1][l]]+map[a[2][l]]+jin[l]; jin[l-1]=0; if(c>=n)jin[l-1]=1,c-=n; if(check(l,c))return; bool flag=0; if(!be[a[h][l]])giv(h,l,c),flag=1; // printf("(h=%d l=%d %d %d %d) ",h,l,map[a[1][l]],map[a[2][l]],map[a[3][l]]); dfs2(1,l-1); if(flag)clear(h,l,c); return; } else if(!be[a[h][l]]) { for(int i=0;i<n;i++) if(!use[i]) { giv(h,l,i); dfs2(h+1,l); clear(h,l,i); } } else dfs2(h+1,l); } int main() { scanf("%d",&n); cin>>a[1]; cin>>a[2]; cin>>a[3]; // for(int i=1;i<=3;i++) // { // scanf("%c",&ch); // for(int j=1;j<=n;j++) // { // scanf("%c",&ch); // a[i][j]=ch-64; // } // } dfs2(1,n-1); }
原来的写法(10分蜜汁,按列枚举)
#include<iostream> #include<cstdio> #include<cstdlib> using namespace std; int n,map[300]; char a[5][30]; bool use[30],be[300]; void clear(int h,int l,int num) { map[a[h][l]]=0;use[num]=0;be[a[h][l]]=0; } void giv(int h,int l,int num) { map[a[h][l]]=num;use[num]=1;be[a[h][l]]=1; } bool check(int l,int num) { if((!be[a[3][l]]&&!use[num])||(be[a[3][l]]&&use[num]&&map[a[3][l]]==num))return 0; return 1; } bool checkk(int l) { for(int k=l;k>=0;k--) if(be[a[1][k]]&&be[a[2][k]]&&be[a[3][k]]) { int c=map[a[1][k]]+map[a[2][k]]; int c1=c%n,c2=(c+1)%n; if(map[a[3][k]]!=c1&&map[a[3][k]]!=c2)return 1; } return 0; } void dfs(int k,int plus) { if(k<0) { for(int i=65;i<=91;i++) if(be[i])printf("%d ",map[i]); exit(0); } if(!be[a[1][k]]) for(int i=0;i<n;i++) if(!use[i]) { giv(1,k,i); // printf("h=1 l=%d map=%d ",k,i); if(be[a[2][k]]) { // printf(" h=2 l=%d map=%d ",k,map[a[2][k]]); bool flag=0; int c=i+map[a[2][k]]+plus; int plu=c/n;c%=n; if(check(k,c)) { // printf("! h=3 l=%d map=%d c=%d ",k,map[a[3][k]],c); clear(1,k,i);continue; } if(!be[a[3][k]])giv(3,k,c),flag=1; if(checkk(k)) { clear(1,k,i);continue; } dfs(k-1,plu); if(flag)clear(3,k,c); } else { for(int j=0;j<n;j++) if(!use[j]) { bool flag=0; giv(2,k,j); // printf(" h=2 l=%d map=%d ",k,map[a[2][k]]); int c=i+j+plus; int plu=c/n;c%=n; if(check(k,c)) { // printf("! h=3 l=%d map=%d c=%d ",k,map[a[3][k]],c); clear(2,k,j);continue; } if(!be[a[3][k]])giv(3,k,c),flag=1; if(checkk(k)) { clear(2,k,j);continue; } dfs(k-1,plu); if(flag)clear(3,k,c); clear(2,k,j); } } clear(1,k,i); } if(be[a[1][k]]) { // printf("h=1 l=%d map=%d ",k,map[a[1][k]]); if(be[a[2][k]]) { // printf(" h=2 l=%d map=%d ",k,map[a[2][k]]); bool flag=0; int c=map[a[1][k]]+map[a[2][k]]+plus; int plu=c/n;c%=n; if(check(k,c)) { // printf("! h=3 l=%d map=%d c=%d ",k,map[a[3][k]],c); return; } if(!be[a[3][k]])giv(3,k,c),flag=1; if(checkk(k))return; dfs(k-1,plu); if(flag)clear(3,k,c); } else { // printf(" h=2 l=%d map=%d ",k,map[a[2][k]]); for(int i=0;i<n;i++) if(!use[i]) { bool flag=0; giv(2,k,i); int c=map[a[1][k]]+i+plus; int plu=c/n;c%=n; if(check(k,c)) { // printf("! h=3 l=%d map=%d c=%d ",k,map[a[3][k]],c); clear(2,k,i);continue; } if(!be[a[3][k]])giv(3,k,c),flag=1; if(checkk(k)) { clear(2,k,i);continue; } dfs(k-1,plu); if(flag)clear(3,k,c); clear(2,k,i); } } } } int main() { scanf("%d",&n); cin>>a[1]; cin>>a[2]; cin>>a[3]; dfs(n-1,0); }
更加原来的,与上面相比输入不同(0分)
#include<iostream> #include<cstdio> #include<cstdlib> using namespace std; int n,a[5][30],map[30]; char ch; bool use[30],be[30]; void clear(int h,int l,int num) { map[a[h][l]]=0;use[num]=0;be[a[h][l]]=0; } void giv(int h,int l,int num) { map[a[h][l]]=num;use[num]=1;be[a[h][l]]=1; } bool check(int l,int num) { if((!be[a[3][l]]&&!use[num])||(be[a[3][l]]&&use[num]&&map[a[3][l]]==num))return 0; return 1; } bool checkk() { for(int k=1;k<=n;k++) if(be[a[1][k]]&&be[a[2][k]]&&be[a[3][k]]) { int c=map[a[1][k]]+map[a[2][k]]; int c1=c%n,c2=(c+1)%n; if(map[a[3][k]]!=c1&&map[a[3][k]]!=c2)return 1; } return 0; } void dfs(int k,int plus) { if(checkk())return; if(!k) { for(int i=1;i<=n;i++) printf("%d ",map[i]); exit(0); } if(!be[a[1][k]]) for(int i=0;i<n;i++) if(!use[i]) { giv(1,k,i); // printf("h=1 l=%d map=%d ",k,i); if(be[a[2][k]]) { // printf(" h=2 l=%d map=%d ",k,map[a[2][k]]); bool flag=0; int c=i+map[a[2][k]]+plus; int plu=c/n;c%=n; if(check(k,c)) { // printf("! h=3 l=%d map=%d c=%d ",k,map[a[3][k]],c); clear(1,k,i);continue; } if(!be[a[3][k]])giv(3,k,c),flag=1; dfs(k-1,plu); if(flag)clear(3,k,c); } else { for(int j=0;j<n;j++) if(!use[j]) { bool flag=0; giv(2,k,j); // printf(" h=2 l=%d map=%d ",k,map[a[2][k]]); int c=i+j+plus; int plu=c/n;c%=n; if(check(k,c)) { // printf("! h=3 l=%d map=%d c=%d ",k,map[a[3][k]],c); clear(2,k,j);continue; } if(!be[a[3][k]])giv(3,k,c),flag=1; dfs(k-1,plu); if(flag)clear(3,k,c); clear(2,k,j); } } clear(1,k,i); } if(be[a[1][k]]) { // printf("h=1 l=%d map=%d ",k,map[a[1][k]]); if(be[a[2][k]]) { // printf(" h=2 l=%d map=%d ",k,map[a[2][k]]); bool flag=0; int c=map[a[1][k]]+map[a[2][k]]+plus; int plu=c/n;c%=n; if(check(k,c)) { // printf("! h=3 l=%d map=%d c=%d ",k,map[a[3][k]],c); return; } if(!be[a[3][k]])giv(3,k,c),flag=1; dfs(k-1,plu); if(flag)clear(3,k,c); } else { // printf(" h=2 l=%d map=%d ",k,map[a[2][k]]); for(int i=0;i<n;i++) if(!use[i]) { bool flag=0; giv(2,k,i); int c=map[a[1][k]]+i+plus; int plu=c/n;c%=n; if(check(k,c)) { // printf("! h=3 l=%d map=%d c=%d ",k,map[a[3][k]],c); clear(2,k,i);continue; } if(!be[a[3][k]])giv(3,k,c),flag=1; dfs(k-1,plu); if(flag)clear(3,k,c); clear(2,k,i); } } } } int main() { scanf("%d",&n); for(int i=1;i<=3;i++) { scanf("%c",&ch); for(int j=1;j<=n;j++) { scanf("%c",&ch);a[i][j]=ch-64; } } dfs(n,0); }