P1605 迷宫(DFS深度优先搜索)

题目链接

P1605 迷宫 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

思路

本来以为是简单题,结果像以前一样用bfs才得40分。bfs的搜索路上的标记会影响到其他路线的进行,所以答案远远少于正确值。

用dfs才比较快速的写出来。
(但是还不太会)

dfs的思路就是不见黄河不回头,使用递归先把走过的地方给标记了,结束再还回来。写过一段时间bfs在写dfs能比较理解了。

AC代码

#include <iostream>
using namespace std;
int n, m;
int t;
int sx, sy;
int fx, fy;//题目给的变量
bool visited[6][6];//地图障碍兼走过的路径标记
int dx[] = { 0,0,1,-1 };
int dy[] = { 1,-1,0,0 };
int ans;
void dfs(int x,int y)
{
	if(x==fx&&y==fy)
	{
		ans++;//满足条件时增加条数,结束递归。
		return;
	}
	else
	{
		for(int i=0;i<4;i++)
		{
			int nx = x + dx[i];
			int ny = y + dy[i];
			if(nx>=1&&nx<=n&&ny>=1&&ny<=m&&!visited[nx][ny])//如果合法则往下搜索
			{
				visited[nx][ny] = true;//先打上标记
				dfs(nx, ny);//往下走
				visited[nx][ny] = false;//走完复原标记,这样就不会和其他路线冲突
			}
		}
	}
}
int main(int argc, char* argv[])
{
	cin >> n >> m >> t;
	cin >> sx >> sy;
	cin >> fx >> fy;
	visited[sx][sy] = true;//记得开始点要打标记,防止重复走起点
	for(int i=0;i<t;i++)
	{
		int t1, t2;
		cin >> t1 >> t2;
		visited[t1][t2] = true;
	}
	dfs(sx, sy);
	cout << ans;
	return 0;
}

心得

这个真的是大水题了。也可以用来入门dfs,比八皇后还简单。小摸一天!

posted @ 2022-01-14 21:47  张牧歌  阅读(41)  评论(1编辑  收藏  举报