luogu P1605迷宫 的思路

dfs的思路

核心思想: 我们走到每一个格点上时,都要对上下左右四个方向进行判断,若这个点为合法,那么这个点的坐标放进下一个递归了,否则跳过

细节内容:
1.关于合法的判断:因为你当前这个格点是由上一个格点坐过来或所在的路线,所以你要使用一个bool标记你走过的路,走过的坐标标 记为1(初始化为0)。所以,合法的坐标为:1.不越界 2.没有走过 3.没有障碍物

2.判断的方法:因为当前待判断的横坐标为原横坐标+1 或 -1(纵坐标也如此),所以可以定义两个大小为4的int数组dfx(加在x上)和dfy(加在y上),使用一个循环4次的for循环,每次循环代表向上,向下,向左,向右;每次在原坐标上都加上dfx[i]或dfy[i],就是待判断的坐标了

3.判断完后:若合法,将x+dfx[i],y+dfy[i]放入递归了,然后将x+dfx[i],y+dfy[i]标记为未走过(回溯)

注意事项
在输入起点坐标后,要将这个坐标标为走过(我也不知道为什么)

题解

#include <bits/stdc++.h>
#define ll long long
using namespace std;
int n,m,t;
bool stop[6][6];
bool walk[6][6];
int dfx[4]={0,0,-1,1};
int dfy[4]={1,-1,0,0,};
int fx,fy,sx,sy;
int sum;
void dfs(int x,int y)
{
	if(x==fx and y==fy)
	{
		sum++;
		return;
	}
	else
	{
		for(int i=0;i<4;++i)//0上,1下,2左,3右
		{
			int cx=x+dfx[i];
			int cy=y+dfx[i];
			if(walk[cx][cy]==0 and stop[cx][cy]==0 and cx>=1 and cy>=1 and cx<=n and cy<=m)
			{
				walk[cx][cy]=1;
				dfs(cx,cy);
				walk[cx][cy]=0;
			}
		} 
	}
	return;
 } 
signed main()
{
	cin>>n>>m>>t;
	cin>>sx>>sy>>fx>>fy;
	walk[sx][sy]=1;
	while(--t)
	{
		int X,Y;
		cin>>X>>Y;
		stop[X][Y]=1;
	} 
	dfs(sx,sy);
	cout<<sum;
	return 0;
} 
posted @ 2026-04-15 11:06  kozeki_ui  阅读(16)  评论(0)    收藏  举报