传送门
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");
}