IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 《啊哈,算法》-9-深度优先遍历-C语言编程实现(小游戏情景学习) -> 正文阅读

[数据结构与算法]《啊哈,算法》-9-深度优先遍历-C语言编程实现(小游戏情景学习)

一、问题描述

再次使用这个小案例:
一道奥数题目:将数字1-9分别填入9个【】中,每个数字只能使用一次使得等式成立。
【】【】【】+【】【】【】=【】【】【】
请问一共有多少中合理的组合呢?
注意:173+286=459与286+173=459是同一种组合。
上次我们使用的方法是枚举法。

二、思路解析及深度优先遍历

其实这道题可以加一个情景
你手里有编号1-9的9张扑克牌,然后将这9张牌放在9个盒子中。
并使得【】【】【】+【】【】【】=【】【】【】成立。
一共有多少种方法?

深度优先遍历(Depth First Search:dfs):
该模型在于解决“当下应该如何做",至于“下一步如何做”,则与“当下应该如何做”是一样的。
通常的方法就是把每一种可能都尝试一遍(一般使用for循环来实现),当前的一步解决了就进入下一步。
下一步的解决方法和当前完全是一样的。
深度优先遍历基本模型如下:

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

三、代码复现

#include<stdio.h> 
int a[10],book[10],total=0;
void dfs(int step)//step表示现在站在第几个盒子面前
{
	int i;
	if(step==10)//如果站在第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])
		{
			//如果满足要求,可行解加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);//如果==0表示还在手上 
		{						
			//开始尝试使用扑克牌
			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);
	getchar();
	getchar();
	return 0; 
}

四、总结

深度优先遍历,每一种尝试都是一种扩展,每次站在盒子前边,其实有n中扩展方法,但是并不是每一种扩展都可以成功。

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-03-08 22:48:16  更:2022-03-08 22:51:45 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 13:44:15-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码