传送门 Claris代码风格实在是不忍直视。 直接爆枚是单个数字上修改还是从一个数字移到另一个数字。 只是读入输出炒鸡麻烦。
#include<cmath> #include<cstdio> #include<cstring> #include<cstdlib> #include<iostream> #include<algorithm> #define N 1010 #define debug printf("sb\n"); using namespace std; char s[N]; int n,m,i,j,k,I,J,K,pos; int a[10][10],b[10][10],Pow[10],v[N],w[N]; int e[N][10],l[N]; long long sum,tmp; void print(){ for (i=1;i<=pos;i++){ if (i>1) putchar(w[i]==1?'+':'-'); else if (w[i]!=1) putchar('-'); for (int j=l[i]-1;~j;j--) printf("%d",e[i][j]); } putchar('='); for (;i<=n;i++){ if (i>pos+1) putchar(w[i]!=1?'+':'-'); else if (w[i]==1) putchar('-'); for (int j=l[i]-1;~j;j--) printf("%d",e[i][j]); } putchar('#'); exit(0); } int main(){ Pow[0]=1; for (i=1;i<8;i++) Pow[i]=Pow[i-1]*10; a[0][6]=a[0][9]=a[2][3]=a[3][2]=1; a[3][5]=a[5][3]=a[6][0]=a[6][9]=1; a[9][0]=a[9][6]=b[0][8]=b[1][7]=1; b[3][9]=b[5][6]=b[5][9]=b[6][8]=b[9][8]=1; scanf("%s",s+1); n=1; if (s[1]=='-') i=2,w[1]=-1; else i=w[1]=1; for (;s[i]>='0'&&s[i]<='9';i++){ v[n]=v[n]*10+s[i]-48; e[n][l[n]++]=s[i]-'0'; } while (s[i]!='='){ w[++n]=(s[i++]=='+')?1:-1; for (;s[i]>='0'&&s[i]<='9';i++){ v[n]=v[n]*10+s[i]-48; e[n][l[n]++]=s[i]-'0'; } } pos=n++; if (s[++i]=='-') i++,w[n]=1; else w[n]=-1; for (;s[i]>='0'&&s[i]<='9';i++){ v[n]=v[n]*10+s[i]-48; e[n][l[n]++]=s[i]-'0'; } while (s[i]!='#'){ w[++n]=(s[i++]=='+')?-1:1; for (;s[i]>='0'&&s[i]<='9';i++){ v[n]=v[n]*10+s[i]-48; e[n][l[n]++]=s[i]-'0'; } } for (i=1;i<=n;i++){ sum+=v[i]*w[i]; for (j=0,k=l[i]-1;j<k;j++,k--) swap(e[i][j],e[i][k]); } for (i=1;i<=n;i++) for (j=0;j<l[i];j++) for (k=0;k<=9;k++) if (a[e[i][j]][k]){ tmp=sum+w[i]*(k-e[i][j])*Pow[j]; if (!tmp){ e[i][j]=k; print(); } } for (i=1;i<=n;i++) for (j=0;j<l[i];j++) for (I=1;I<=n;I++) for (J=0;J<l[I];J++) if (I!=i||J!=j) for (k=0;k<=9;k++) for (K=0;K<=9;K++) if (b[e[i][j]][k]&&b[K][e[I][J]]){ tmp=sum+w[i]*(k-e[i][j])*Pow[j]+w[I]*(K-e[I][J])*Pow[J]; if (!tmp){ e[i][j]=k; e[I][J]=K; print(); } } puts("No"); }