深度优先搜索解决坑爹的奥数

坑爹的奥数题目是:£££+£££=£££,将数字1~9分别填入9个£中,每个数字只能使用一次使得等式成立。例如173+286=459就是一个合理的组合,请问一共有多少种合理的组合呢?注意:173+286=459与286+173=459是同一种组合!!

深度优先搜索(Depth First Search,DFS)
DFS的关键在于解决“当下该如何做。”下面的代码就是深度优先搜索的基本模型:

void dfs(int step)
{
  判断边界
  尝试每一种可能 for (i=1;i<n;i++)
  {
  	继续下一步 dfs(step+1);
  }
返回
}

分析题目
这个题目就相当于你手中有编号为1~9的九张扑克牌,然后将这九张扑克牌放到九个盒子里面,并使得£££+£££=£££成立。其实就是判断一下a[1]*100+a[2]*10+a[3]+a[4]*100+a[5]*10+a[6]=a[7]*100+a[8]*10+a[9]
这个等式是否成立。

现在,基于深度优先搜索的基本模型和题目分析是不是已经知道怎么写了呢。那么下面我们就开始码代码啦!!

#作者:小斌斌(有问题加QQ:3105814524,备注来意)
#include<stdio.h>
int a[10],book[10],total=0;
void DFS(int step)//step表示站在第几个盒子面前
{
	int i;
	if(step==10)//如果站在第十个盒子面前,则表示前9个盒子已经放好扑克牌
	{
		//判断是否满足等式£££+£££=£££
		if(a[1]*100+a[2]*10+a[3]+a[4]*100+a[5]*10+a[6]=a[7]*100+a[8]*10+a[9])
		{
			//如果满足要求,可行解total+1,并打印这个解
			total++;
			printf("%d%d%d+%d%d%d=%d%d%d\n",a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9]);
		}
	return ;//返回之前的一步(最近调用的地方)
	}
//此时站在弟step个盒子面前,应该放那张牌呢?
//按照1、2、3......n的顺序一一尝试
for (i=1;i<=9;i++)
{
//判断扑克i是否还在手上
if(book[i]==o)//book[i]为0表示扑克牌还在手上
{
//开始尝试使用扑克i
a[step]=i;//将扑克i放入到第step个盒子中
book[i]=1;//将book[i]的值设为1,表示扑克牌i已经不在手上
//第step个盒子已经放置好扑克牌,走到下一个盒子面前
DFS(step+1;//这里通过函数递归调用来实现(自己调用自己)
//这里非常重要的一步,一定要将刚才尝试的扑克牌收回,才能进行下一次尝试
book[i]=0;
}
}
return ;
}
int main()
{
	DFS(1);//首先站在第一个盒子面前
	printf("total=%d",total/2);//这里为什么要除以2前面已经解释过了哦
	getchar();getchar();
	return0;

}

根据这个坑爹的奥数题目是不是已经初步了解了深度优先搜索这个概念了呢。
赶紧去做一些深度优先搜索的题目去加强自己的技能吧!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱吃香菜的斌斌

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值