3. 三羊献瑞
观察下面的加法算式:
祥 瑞 生 辉
+ 三 羊 献 瑞
-------------------
三 羊 生 瑞 气
观察下面的加法算式:
祥 瑞 生 辉
+ 三 羊 献 瑞
-------------------
三 羊 生 瑞 气
(如果有对齐问题,可以参看【图1.jpg】)其中,相同的汉字代表相同的数字,不同的汉字代表不同的数字。请你填写“三羊献瑞”所代表的4位数字(答案唯一),不要填写任何多余内容。
最笨的穷举法:
/*
因为是加法,所以易得“三”为1
因为“三”+“祥”要有进位,所以“祥”为8或9,此时可以看出羊只能是0
此时“羊”+“瑞”最大为后一位进一个加9,而“羊”为0,所以“生”不可能为0,所以百位不能生成进位,得到“祥”为9
*/
#include<stdio.h>
int main()
{
int a,b,c,d,e,x1,x2;
for(a=2;a<=8;a++)
{
for(b=2;b<=8;b++)
{
if(b==a+1)
{
for(c=2;c<=8;c++)
{
if(c!=a&&c!=b)
{
for(d=2;d<=8;d++)
{
if(d!=a&&d!=b&&d!=c&&(b+d>=10))
{
for(e=2;e<=8;e++)
{
if(e!=a&&e!=b&&e!=c&&e!=d)
{
x1=(9*1000+a*100+b*10+c)+(1000+d*10+a);
x2=1*10000+b*100+a*10+e;
if(x1==x2)
{
printf("10%d%d\n",d,a);
}
}
}
}
}
}
}
}
}
}
return 0;
}
递归实现的dfs+回溯方法:
/* 祥5 瑞3 生2 辉6
+ 三0 羊1 献7 瑞3
-------------------
三0 羊1 生2 瑞3 气4
*/
#include<iostream>
using namespace std;
int visit[10],a[8];
void dfs(int step)
{
if(step>7)
{
int b=a[5]*1000+a[3]*100+a[2]*10+a[6];
int c=a[0]*1000+a[1]*100+a[7]*10+a[3];
int d=a[0]*10000+a[1]*1000+a[2]*100+a[3]*10+a[4];
if(b+c==d)
{
cout<<a[0]<<" "<<a[1]<<" "<<a[7]<<" "<<a[3]<<endl;
}
return;
}
for(int j=0;j<=9;j++)
{
if(step==0&&j!=1)//剪枝在for循环里面剪
{
continue;//结束单次循环
}
if(visit[j]==0)
{
visit[j]=1;
a[step]=j;
dfs(step+1);
visit[j]=0;
}
}
return;
}
int main()
{
dfs(0);
return 0;
}