迷宫问题---深度搜索(dfs)

描述

设有一个N*N(2<=N<10)方格的迷宫,入口和出口分别在左上角和右上角。迷宫格子中分别放0和1,0表示可通,1表示不能,入口和出口处肯定是0。迷宫走的规则如下所示:即从某点开始,有八个方向可走,前进方格中数字为0时表示可通过,1时表示不可通过,要另找路径。找出所有从入口(左上角)到出口(右上角)的路径(不能重复),输出路径总数,如果无法到达,则输出0.

输入

第一行为整数N(2<=N<10),
以下N行为格子中放的0或1。

输出

路径总数

样例输入

3
0 0 0
0 1 1
1 0 0

样例输出

2

分析:这道题可以用深度搜索(dfs)来解决,从迷宫开始(左上角)到出口(右上角),每次走通路(0),当遇到障碍物(1)时,就回头找另外的路,由于在这个迷宫里可以有“左上,上,右上,左,右,左下,下,右下“八个方向可以走,所以我们可以定义用来记录下一步走哪数组(一维数组和二维数组都可以)。在判断下一步走哪的时候,要记得判断是否越界(跑到迷宫外面)。

以下是全部代码:

#include<bits/stdc++.h>
using namespace std;
int n,sum=0;
int a[100][100],b[100][100];
void dfs(int x,int y)
{
    int sx[8]={0,0,1,1,1,-1,-1,-1};//八个方向,横与纵相对应。
    int sy[8]={1,-1,0,1,-1,0,1,-1};
    int p,q;
    if(x==1&&y==n)//如果到达终点,方案数+1//终点始终在右上角
    {
        sum++;
        return;
    }
    for(int i=0;i<8;++i)//枚举八个方向
    {
        p=x+sx[i];
        q=y+sy[i];
        if(p>0&&q>0&&p<=n&&q<=n&&a[p][q]==0&&b[p][q]==0)//越界情况判定,最后一个是判断是否可以过 
        {                                                
            b[p][q]=1;
            dfs(p,q);//下一步的判定
            b[p][q]=0;//回溯
        }
    }
    return;//这个return的位置不能在循环里,不然只会记录一种情况(sum=1)
}

int main()
{
    scanf("%d",&n);
    for (int i=1;i<=n;++i)
      for (int j=1;j<=n;++j)
        scanf("%d",&a[i][j]);
    b[1][1]=1;//初始点一定可以过 
    dfs(1,1);
    printf("%d",sum);
    return 0;
}
    原文作者:DFS
    原文地址: https://blog.csdn.net/gakki_529/article/details/78740444
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞