欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

DFS(深搜/4/18)

程序员文章站 2022-07-12 21:51:00
...

P1605 迷宫

一开始把newx和newy都设置成了全局变量,结果一直错,后来才发现不能这样,因为回溯的时候,回溯到前面的时候,newx newy还是后面的,没有回来,而局部变量的话就不用担心作用域内改变

#include <bits/stdc++.h>
using namespace std;
int n,m,sum;//必须都要定义在前面,养成习惯
int a[1005][1005];
int vis[60][60];
int dir[4][2]={{1,0},{-1,0},{0,1},{0,-1}};//定义四个方向
int x,y,beginx,beginy,endx,endy,t;
void dfs(int x,int y)
{
    if(x==endx&&y==endy){sum++;return;}//这一句要记得不要写在for里面
    for(int i=0;i<4;i++)
    {
        int newx=x+dir[i][0];//这里必须是局部变量不能是全局变量,否则回溯不成功!!!
        int newy=y+dir[i][1];//若是全局变量则会永久加,当回溯的时候,只会回溯最后那一个
        if(newx>0&&newx<=n&&newy>0&&newy<=m&&a[newx][newy]==0&&vis[newx][newy]==0)//newx对应的是二维数组的 第一维 !!!即行数也就是n!
        {
            a[newx][newy]=1;
            dfs(newx,newy);
            a[newx][newy]=0;
        }
    }
}
int main()
{
    cin>>n>>m;
    cin>>t;
    cin>>beginx>>beginy>>endx>>endy;
    while(t--)
    {
        cin>>x>>y;
        vis[x][y]=1;
    }
    vis[beginx][beginy]=1;
    dfs(beginx,beginy);
    cout<<sum<<endl;
    return 0;
}