P1605 迷宫 (DFS)方案数

在这里插入图片描述
思路:直接用DFS搜索,要注意的是这个题是找起点坐标到终点坐标的方案数,所以我们在递归调用之后要记得还原标记数组,不然后面无法统计方案数。

#include <bits/stdc++.h>
using namespace std;
int n,m,t,sx,sy,fx,fy,ans=0;
int vis[10][10],mp[10][10];
int step_x[4] = {0,0,1,-1}; //方向数组
int step_y[4] = {1,-1,0,0};

void dfs(int x,int y){
    if(x==fx&&y==fy){ //走到了结束的点
        ans++;
        return ;     
    }
    for(int i=0;i<4;i++){
        int xi = x + step_x[i];
        int yi = y +step_y[i];
        if(xi>0&&xi<=n&&yi>0&&yi<=m&&vis[xi][yi]!=1&&mp[xi][yi]!=1){
            vis[xi][yi] = 1; //标记这个点走过了
            dfs(xi,yi);
            vis[xi][yi] = 0; //还原这个点
        }
    }
    return ;
}

int main()
{
    cin>>n>>m>>t;
    cin>>sx>>sy>>fx>>fy;
    for(int i=0;i<t;i++){
        int x,y; cin>>x>>y;
        mp[x][y] = 1;//标记障碍物
    }
    vis[sx][sy] = 1;  //一定要记得把起点标记了,不标记后面可能会再次走到起点位置
    dfs(sx,sy);
    cout<<ans<<endl;
    return 0;
}

/*
2 2 1
1 1 2 2
1 2
*/

可能我撞了南墙才会回头吧。可能我见了黄河才会死心吧…

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
矩阵迷宫是一个非常有趣的问题,可以通过深度优先搜索算法(DFS)来解决。下面是一个使用Python语言编写的矩阵迷宫DFS程序的设计思路。 首先,我们需要定义一个函来判断某个位置是否可以作为下一步的移动目标。在矩阵迷宫中,我们通常用1表示可行路线,用0表示墙壁或不可行路线。因此,我们可以定义一个函is_valid(row, col, maze),其中row和col分别表示当前位置的行和列,maze是迷宫的矩阵表示。在这个函中,我们可以判断当前位置是否越界或者是墙壁,如果满足这些条件,则说明不可行,返回False,否则返回True。 接下来,我们可以定义一个递归的函dfs(row, col, maze, visited),其中row和col表示当前位置的行和列,maze是迷宫的矩阵表示,visited是一个与maze相同大小的矩阵,表示是否已经访问过。在这个函中,我们首先判断当前位置是否是终点(例如迷宫的右下角),如果是,则找到了一条可行路径,返回True。如果当前位置不是终点,则标记当前位置为已访问,并依次判断当前位置的上、下、左、右四个方向是否可行。如果某个方向可行,我们可以将当前位置移动到该方向,并递归调用dfs。如果在某个方向上找到了一条可行路径,我们可以返回True,否则继续搜索其他方向。如果四个方向都不可行,我们可以将当前位置的visited标记为False,并返回False。 最后,我们可以定义一个主函solve(maze),其中maze是迷宫的矩阵表示。在这个函中,我们可以首先创建一个与maze相同大小的visited矩阵,并将所有元素初始化为False。接下来,我们调用dfs迷宫的起点(例如迷宫的左上角)开始搜索,并将结果返回。 这样,我们就完成了一个使用深度优先搜索算法解决矩阵迷宫问题的程序。通过调用主函,并传入迷宫矩阵作为参,我们可以获得是否存在可行路径的结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值