迷宫(深度搜索dfs)

首先输入一个迷宫,用0,1表示,如:m行n列的迷宫

5 4

0 0 1 0

0 0 0 0

0 0 1 0

0 1 0 0

0 0 0 1

0表示通路,1表示障碍。

然后输入起始点的坐标和终止点的坐标,求从起点到终点最少的步数。

用dfs,代码如下:

<span style="font-size:18px;">#include<stdio.h>
int book[51][51],p[51][51];
int min=99999,endx,endy;//因为终点坐标要在dfs和主函数中使用,所以应该用全局变量
	int m,n;
void dfs(int x,int y,int step)
{
	int tx,ty;
	int next[4][4]={{0,1},{-1,0},{0,-1},{1,0}};//数组代表上下左右四个方向
	if(x==endx&&y==endy)//当起点和终点相等的时候
	{
		if(step<min)//求最小步数
		min=step;
		return;//必须要有
	}
	for(int k=0;k<=3;k++)//从上下左右四个不同的方向进行搜索
	{
		tx=x+next[k][0];
		ty=y+next[k][1];
		if(tx<0||tx>=m||ty<0||ty>=n)//超出迷宫边界时,continue
		{
			continue;
		}
		if(book[tx][ty]==0&&p[tx][ty]==0)//如果当前坐标没有被走过,并且不是障碍
		{
			book[tx][ty]=1;//把当前坐标标记为走过
			dfs(tx,ty,step+1);进行下一阶段的dfs
			book[tx][ty]=0;回溯再次搜索时释放已标记的路径
		}
	}
	return;
}
int main(void)
{

	int beginx,beginy;
	scanf("%d%d",&m,&n);//输入行和列
	for(int i=0;i<m;i++)
	for(int j=0;j<n;j++)
	{
		scanf("%d",&p[i][j]);//输入迷宫,0,1表示
	}
	scanf("%d%d%d%d",&beginx,&beginy,&endx,&endy);//输入起点和终点的坐标
	book[beginx][beginy]=1;//book是标记数组,值为1的时候,代表此坐标已经走过,因为起点已经走过,所以首先置为1
	dfs(beginx,beginy,0);当前阶段已经做完,并且一步还没有走,所以转向下一个阶段
	printf("%d\n",min);
	return 0;
}</span>
时间: 2024-10-16 04:12:02

迷宫(深度搜索dfs)的相关文章

深度搜索DFS!

好的,接下来就是本萌新的第一篇博客啦.直接上深搜!深度优先搜索(Depth-First-Search),简称“深搜”(dfs),是我们蒟蒻们最基本的搜索操作之一.简单地说,深搜就是递归.下面是抄来的解释:深度优先搜索用一个数组存放产生的所有状态.(1) 把初始状态放入数组中,设为当前状态:(2) 扩展当前的状态,产生一个新的状态放入数组中,同时把新产生的状态设为当前状态:(3) 判断当前状态是否和前面的重复,如果重复则回到上一个状态,产生它的另一状态:(4) 判断当前状态是否为目标状态,如果是目

数据结构之 栈与队列--- 走迷宫(深度搜索dfs)

走迷宫 Time Limit: 1000MS Memory limit: 65536K 题目描述 一个由n * m 个格子组成的迷宫,起点是(1, 1), 终点是(n, m),每次可以向上下左右四个方向任意走一步,并且有些格子是不能走动,求从起点到终点经过每个格子至多一次的走法数. 输入 第一行一个整数T 表示有T 组测试数据.(T <= 110) 对于每组测试数据: 第一行两个整数n, m,表示迷宫有n * m 个格子.(1 <= n, m <= 6, (n, m) !=(1, 1)

Word Search(深度搜索DFS,参考)

Given a 2D board and a word, find if the word exists in the grid. The word can be constructed from letters of sequentially adjacent cell, where "adjacent" cells are those horizontally or vertically neighboring. The same letter cell may not be us

Luogu P1141 01迷宫【搜索/dfs】By cellur925

题目传送门 我tm到现在还需要刷这种水搜索...我退役吧. 但就是搜索弱嘛 补一补嘛qwq 题目大意:给你一张地图与许多询问,每次询问求这个点所在联通块的点的个数. 所以这个题目的本质就是在求联通块.可以联想到那天测试的题,把看似bfs的题写成dfs. 注意:联通块数组开小了导致RE=== 1 #include<cstdio> 2 #include<queue> 3 #include<algorithm> 4 #include<cstring> 5 6 us

DFS深度搜索的一般思想

对于无向图来说DFS深度搜索 递归思想 //深度优先搜索DFS的一般实现 void DFS(MGraph G,int i)//DFS递归思想 { int j; visited[i]=TRUE;//设置Node已经被访问 printf("%c",G.vexs[i]); for(j=0;j<numVertexes;j++)//对此Node跟Node2(j)遍历 如果arc[][]==1则表明当前DFS的Node与Node2(j)连通,且满足Node2未被访问的条件下 则对Node2进

迷宫问题解决方法:分别基于深度搜索和广度搜索的思想来实现

本文针对迷宫问题,探讨解决思路并给出实现代码.在本文中,采用的图的深度优先搜索和广度优先搜索两种方法分别对迷宫的路径进行了求解. 首先来看迷宫问题的描述,可以参考此处,简而言之就是,通过一个二维数组(int型)来表示迷宫,迷宫中0表示可行,1表示不可行.在本文的实现中,可以输入给定迷宫,定义迷宫入口和出口,并查找迷宫路径. 总体的描述:在本文中,定义了结构体Node,用于存放节点信息,而Node内只有两个变量,标识节点的行坐标与列坐标.定义了迷宫类maze,并分别定义了相应的get.set函数,

题目--oil Deposits(油田) 基础DFS(深度搜索)

上一次基本了解了下BFS,这次又找了个基本的DFS题目来试试水,DFS举个例子来说就是 一种从树的最左端开始一直搜索到最底端,然后回到原端再搜索另一个位置到最底端,也就是称为深度搜索的DFS--depth first search,话不多说,直接上题了解: Description:某石油勘探公司正在按计划勘探地下油田资源,工作在一片长方形的地域中.他们首先将该地域划分为许多小正方形区域,然后使用探测设备分别探测每一块小正方形区域内是否有油.若在一块小正方形区域中探测到有油,则标记为’@’,否则标

[LeetCode] Sum Root to Leaf Numbers dfs,深度搜索

Given a binary tree containing digits from 0-9 only, each root-to-leaf path could represent a number. An example is the root-to-leaf path 1->2->3 which represents the number 123. Find the total sum of all root-to-leaf numbers. For example, 1 / 2 3 T

[LeetCode] Convert Sorted List to Binary Search Tree DFS,深度搜索

Given a singly linked list where elements are sorted in ascending order, convert it to a height balanced BST. Hide Tags Depth-first Search Linked List 这题是将链表变成二叉树,比较麻烦的遍历过程,因为链表的限制,所以深度搜索的顺序恰巧是链表的顺序,通过设置好递归函数的参数,可以在深度搜索时候便可以遍历了. TreeNode * help_f(Lis