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;
}
浙公网安备 33010602011771号