深度优先搜索(DFS)

深度优先搜索(DFS)

DFS (Depth First Search,又称深度优先按搜索),是一种经典的搜索算法,它针对与图与树的搜索,可以解决最大路径等问题,算法过程就是由一个点不断深入,直到遇到死路,然后回溯,继续一通到底。

我们可以通过画图理解搜索路程:

我们先找一“棵”树

我们将起点设在1,那么DFS会从1跑到2,然后4,7。

跑到死路后,我们应该回溯,回到4后,发现没有其他路,再回溯到2,发现还有5没走,走到5

然后我们回溯到1,继续向3搜索(这里是优先搜索左子树)

说完了我们来做道题:

题目描述

给定一个 N×M 方格的迷宫,迷宫里有 T 处障碍,障碍处不可通过。

在迷宫中移动有上下左右四种方式,每次只能移动一个方格。数据保证起点上没有障碍。

给定起点坐标和终点坐标,每个方格最多经过一次,问有多少种从起点坐标到终点坐标的方案。

输入格式

第一行为三个正整数N,M,T,分别表示迷宫的长宽和障碍总数。

第二行为四个正整数 SX,SY,FX,FY,SX,SY 代表起点坐标,FX,FY 代表终点坐标。

接下来T 行,每行两个正整数,表示障碍点的坐标。

输出格式

输出从起点坐标到终点坐标的方案总数。

输入数据 1

2 2 1
1 1 2 2
1 2

输出数据 1

1

数据范围与约定

对于 100% 的数据,1≤51≤N,M≤5,1≤101≤T≤10,1≤SX,FX≤n,1≤SY,FY≤m。

代码:

#include<bits/stdc++.h>
using namespace std;
int tx,ty,ans,a[6][6],vis[6][6],n,m;
int dx[] = {0,-1,0,0,1};
int dy[] = {0,0,-1,1,0};
void dfs(int x,int y){
    if(x == tx && y == ty){ //当走到终点,方案数加一
        ans++;
        return;//返回
    }
    for(int i = 1;i <= 4;i++){
        int nx = x+dx[i],ny = y+dy[i]; //向上下左右走一步(比如dx的第1项-1,dy的第1项0,就是x坐标-1,y坐标+0,表示下一行)
        if(nx >= 1 && nx <= n && ny >= 1 && ny <= m && !a[nx][ny] && !vis[nx][ny]){//如果没有越界或者没有走过这个点,进行深搜
            vis[nx][ny] = 1;//标记点
            dfs(nx,ny);
            vis[nx][ny] = 0;//清理现场(回溯)
        }
    }
}
int main(){
    int t,sx,sy;
    cin>> n >> m >> t >> sx >> sy >> tx >> ty;
    int fx,fy;
    for(int i = 1;i <= t;i++){
        cin>> fx >> fy;
        a[fx][fy] = 1; //障碍标记
    }
    vis[sx][sy] = 1;//将起点标记
    dfs(sx,sy);//深搜
    cout<< ans;
    return 0;
}

  • 12
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值