《啊哈算法》 深度优先搜索 P78

#include <stdio.h>

//数组a代表盒子, book代表扑克牌 
int a[10], book[10], n; //C语言的全局变量在没有赋值以前默认为0
						//这里的book数组无需全部再赋初始值为0
void dfs(int step);

int main() {
	scanf("&d", &n); //输入的时候注意,n为 1~9 之间的整数
	dfs(1); // 首先站在一号盒子面前
	getchar(); getchar();
	return 0;  
}


void dfs(int step) // step 表示现在第几个盒子面前
{
	int i;
	if(step == n+1) //如果站在第n+1个盒子面前, 则表示前n个盒子已经放好扑克牌
	{
		// 输出一种排列(1~n)号盒子中的扑克牌编号
		for(i=1; i<=n; i++) printf("%d", a[i]);
		printf("\n");
		return; //返回之前的一步(最近一次调用dfs函数的地方) 
	 } 
	 
	 // 此时站在第step个盒子面前, 应该放哪张牌呢?
	 // 按照1、2、3...n 的顺序一一尝试
	 for(i=1; i<=n; i++) {
	 	// 判断扑克牌i是否还在手上
		if(book[i] == 0) //book[i]等于0表示i号扑克牌在手上
		{
			// 开始尝试使用扑克牌i
			a[step] = i; // 将i号扑克牌放入到第step个盒子中
			book[i] = 1; // 将book[i]标记为1, 表示i号扑克牌已经不在手上了
			
			// 第step个盒子已经放好扑克牌, 接下来需要走到下一个盒子面前
			dfs(step+1); //递归调用自己
			book[i] = 0; //这是非常重要的一步, 一定要将刚才尝试的扑克牌收回, 才能进行下一次尝试
			//放在递归调用后面的语句 , 执行顺序 是反过来的, 所以收回扑克牌是从最后一张放下去的牌开始 
		 } 
	 } 
	
 } 
 
 
 
 /*
 // 深度优先搜索的基本模型
 void dfs(int step) {
 	//STEP.1 判断边界 -> 若达到边界, 则return(返回之前一步调用递归的地方) 
	//STEP.2 尝试每一种可能 
	for(i=1; i<=n; i++) {
		//STEP.3 继续下一步
		dfs(step+1); 
	}
	 //返回
	 return; 
 } 
 */

#include <stdio.h>

int a[10], book[10], total=0; // 记数的一定要初始化为0(虽然全局变量默认的值就是0)

void dfs(int step) ;

int main() {
	dfs(1); //首先站在第一个盒子面前
	
	printf("total = %d", total/2); // 因为相加的两个数可以对调, 所以除以二
	getchar(); getchar();
	return 0; 
} 

void dfs(int step) { // step表示现在站在第几个盒子面前
	int i;
	if(step == 10) // 如果站在第十个盒子面前, 则表示前九个盒子已经放好扑克牌了
	{
		// 判断是否满足等式 xxx + xxx = xxx
		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]) {
				// 如果满足要求, 可行解+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] == 0) {  
		 	a[step] = i;
		 	book[i] = 1;
		 	
		 	dfs(step+1);
		 	book[i] = 0;
		 } 
	 } 
	return;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值