每個字母設置兩種狀態,已知和未知。
進行回溯性搜索。從單位搜索開始,從0到9搜索等式左邊的T和Q,並且將T和Q的狀態設置為已知。這時候妳可以通過搜索e的值很快得到結果,也可以設置為已知。然後搜索十位數。此時已知t的值,搜索未知字母。此外,G+N+N=T是下壹級搜索的條件(如果壹個數字有進位,等式左邊要加1),矛盾的情況就消除了。以此類推,搜索幾百,幾千,因為後面,所以搜索速度會快很多。這是壹個DFS。
閑著無聊,寫了個程序。結果排序為999219919。
# include & ltstdio.h & gt
# include & ltstring.h & gt
int f[6][9];//存儲原始方程
int r[9];//結果
char k[9];//已知?
Int find(int level,int j,int c/*進位*/)
{
如果(級別== 6)
返回1;
如果(j == 9)
{
int t = c;
for(int I = 0;我& lt9;++i)
t+= r[I]* f[level][I];
if(t % 10!= 0)
返回0;
返回find(level + 1,0,t/10);
}
如果(!k[j]& amp;& ampf[級別][j])
{
k[j]= 1;
for(int I = 9;我& gt= 0;-我)
{
r[j]= I;
if(find(level,j+1,c))
返回1;
}
k[j]= 0;
返回0;
}
其他
{
返回find(level,j+1,c);
}
}
int main()
{
memset(f,0,sizeof(f));
memset(r,0,sizeof(r));
memset(k,0,sizeof(k));
//按照vingtcqre的順序
f[0][4]= 1;
f[0][6]= 2;
f[0][8]=-1;
f[1][3]= 1;
f[1][2]= 2;
f[1][4]=-1;
f[2][1]= 2;
f[3][1]= 1;
f[3][5]= 2;
f[3][8]=-1;
f[4][0]= 1;
f[4][7]=-1;
f[5][4]=-1;
find(0,0,0);
//此時結果按照R中vingtcqre的順序保存..
返回0;
}