dfs模板找起点到终点的所有可能路径

Posted diliiiii

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了dfs模板找起点到终点的所有可能路径相关的知识,希望对你有一定的参考价值。

题目描述

设有一个N*N(2≤N≤10)方格的迷宫,入口和出口分别在左上角和右上角。迷宫格子中分别放有0和1,0表示可通,1表示不能,迷宫走的规则如下图所示:即从某点开始,有八个方向可走,前进方格中数字为0时表示可通过,为1时表示不可通过,要另找路径。
技术分享图片

 

输入

第一行一个正整数N,表示N*N的迷宫。
接下来N行,为一个N*N矩阵。
 

 

输出

一行一个正整数,表示路径总数。
 
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int mod=998244353;
int n;
int mp[105][105];
int dx[8]={-1,-1,-1,0,0,1,1,1};
int dy[8]={-1,0,1,-1,1,-1,0,1};
ll ant;
int vis[105][105];
bool check(int x,int y)
{
    if(x<1||x>n||y<1||y>n)
        return 1;
    if(vis[x][y]||mp[x][y])
        return 1;
    return 0;
}
/*void bfs()
{
    queue<node> qu;
    now.x=1,now.y=1;
    vis[now.x][now.y]=1;
    qu.push(now);
    while(!qu.empty())
    {
        now=qu.front();
        qu.pop();
        if(now.x==1&&now.y==n)
            ant++;
        for(int i=0;i<8;i++)
        {
            nex=now;
            nex.x+=dx[i];
            nex.y+=dy[i];
            if(check(nex.x,nex.y))
                continue;
            qu.push(nex);
        }
    }
}*/
void dfs(int x,int y)
{
    if(x==1&&y==n)
    {
        ant++;
        return;
    }
    for(int i=0;i<8;i++)
    {
        int nx=x+dx[i];
        int ny=y+dy[i];
        if(!check(nx,ny))
        {
            vis[nx][ny]=1;
            dfs(nx,ny);
            vis[nx][ny]=0;
        }
    }
}
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=n;j++)
        {
            scanf("%d",&mp[i][j]);
        }
    }
    vis[1][1]=1;
    dfs(1,1);
    printf("%lld
",ant);
    return 0;
}

 




以上是关于dfs模板找起点到终点的所有可能路径的主要内容,如果未能解决你的问题,请参考以下文章

Key Vertex (hdu 3313 SPFA+DFS 求起点到终点路径上的割点)

在图中运行 DFS 的问题

K短路问题模板(spfa+A*)

寻找道路

寻找道路

LeetCode 797 所有可能的路径[DFS 回溯] HERODING的LeetCode之路