1. 程式人生 > 其它 >P1605 迷宮(DFS深度優先搜尋)

P1605 迷宮(DFS深度優先搜尋)

題目連結

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,比八皇后還簡單。小摸一天!