【dfs模板】找起点到终点的所有可能路径
题目描述
设有一个N*N(2≤N≤10)方格的迷宫,入口和出口分别在左上角和右上角。迷宫格子中分别放有0和1,0表示可通,1表示不能,迷宫走的规则如下图所示:即从某点开始,有八个方向可走,前进方格中数字为0时表示可通过,为1时表示不可通过,要另找路径。
输入
第一行一个正整数N,表示N*N的迷宫。
接下来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\n",ant); return 0; }