您的位置:首页 > 其它

一个简单的DFS(深度优先搜索)算法加剪枝技术的程序演示

2009-07-03 22:50 369 查看
/*
*  Author: 冷却
*  Date: 2009年7月3日
*  E-mail: leng_que@yahoo.com.cn
*  Description: 通过DFS(深度优先搜索)算法,再加上一个简单的剪枝技术,很快就能搜索到所有的解
*/

//题目要求:每个字母代表一个数字,且不能重复。并且要使竖式成立。

//  s e t d
//+ m o r d
//---------
//m o t e y

//分析:考虑到 m 为 s+m 后的进位,则m必为0或1。

//注意:由于题目没有指明m是否可以为0,所以我认为m是可以为0的。

#include <iostream>
using namespace std;

int main(void)
{
int s,e,t,d;
int m,o,r,y;
int sum,tmp,i;

for ( m=0; m<=1; m++ )
{
for ( o=0; o<=9; o++ )
{
if ( o==m ) continue;

for ( r=0; r<=9; r++ )
{
if ( r==m || r==o ) continue;

for ( d=0; d<=9; d++ )
{
if( d==m || d==o || d==r ) continue;

for ( s=0; s<=9; s++ )
{
if ( s==m || s==o || s==r || s==d ) continue;

for ( e=0; e<=9; e++ )
{
if ( e==m || e==o || e==r || e==d || e==s ) continue;

for ( t=0; t<=9; t++ )
{
if ( t==m || t==o || t==r || t==d || t== s || t==e ) continue;

sum = (s*1000+e*100+t*10+d) + (m*1000+o*100+r*10+d);
y = sum%10;

if ( y%2 != 0 ) continue;

if ( y==s || y==e || y==t || y==d || y==m || y==o || y==r ) continue;

tmp = sum;

for ( i=1; i<=5; i++ )
{
if ( i==2 && tmp%10 != e ) break;
else if ( i==3 && tmp%10 != t ) break;
else if ( i==4 && tmp%10 != o ) break;
else if ( i==5 && tmp%10 != m ) break;

tmp /= 10;
}

if ( i==6 )
{
cout<<s<<e<<t<<d<<" + "<<m<<o<<r<<d<<" = "<<m<<o<<t<<e<<y<<endl;
}
}
}
}
}
}
}
}

return 0;
}


 

运行结果:

2817 + 0367 = 03184
3716 + 0456 = 04172
3718 + 0458 = 04176
3719 + 0459 = 04178
5731 + 0641 = 06372
6419 + 0729 = 07148
6851 + 0731 = 07582
6852 + 0732 = 07584
6524 + 0734 = 07258
7536 + 0816 = 08352
8652 + 0912 = 09564
8762 + 0912 = 09674
8543 + 0913 = 09456
9346 + 1086 = 10432
9456 + 1086 = 10542
9237 + 1087 = 10324
9567 + 1087 = 10654

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: