1. 程式人生 > >【dfs模板】找起點到終點的所有可能路徑

【dfs模板】找起點到終點的所有可能路徑

mage urn 技術分享 sca pan 不能 有一個 輸入 cpc

題目描述

設有一個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\n",ant); return 0; }

【dfs模板】找起點到終點的所有可能路徑