P1605 迷宮(DFS深度優先搜尋)
阿新 • • 發佈:2022-01-15
題目連結
P1605 迷宮 - 洛谷 | 電腦科學教育新生態 (luogu.com.cn)
思路
本來以為是簡單題,結果像以前一樣用bfs才得40分。bfs的搜尋路上的標記會影響到其他路線的進行,所以答案遠遠少於正確值。
用dfs才比較快速的寫出來。
(但是還不太會)
dfs的思路就是不見黃河不回頭,使用遞迴先把走過的地方給標記了,結束再還回來。寫過一段時間bfs在寫dfs能比較理解了。
AC程式碼
#include <iostream> using namespace std; int n, m; int t; int sx, sy; int fx, fy;//題目給的變數 bool visited[6][6];//地圖障礙兼走過的路徑標記 int dx[] = { 0,0,1,-1 }; int dy[] = { 1,-1,0,0 }; int ans; void dfs(int x,int y) { if(x==fx&&y==fy) { ans++;//滿足條件時增加條數,結束遞迴。 return; } else { for(int i=0;i<4;i++) { int nx = x + dx[i]; int ny = y + dy[i]; if(nx>=1&&nx<=n&&ny>=1&&ny<=m&&!visited[nx][ny])//如果合法則往下搜尋 { visited[nx][ny] = true;//先打上標記 dfs(nx, ny);//往下走 visited[nx][ny] = false;//走完復原標記,這樣就不會和其他路線衝突 } } } } int main(int argc, char* argv[]) { cin >> n >> m >> t; cin >> sx >> sy; cin >> fx >> fy; visited[sx][sy] = true;//記得開始點要打標記,防止重複走起點 for(int i=0;i<t;i++) { int t1, t2; cin >> t1 >> t2; visited[t1][t2] = true; } dfs(sx, sy); cout << ans; return 0; }
心得
這個真的是大水題了。也可以用來入門dfs,比八皇后還簡單。小摸一天!