DAY 15 計蒜客 迷宮(一) dfs

dfs:深度優先搜索(一條路走到黑)

原題鏈接點我

迷宮(一)

一天蒜頭君掉進了一個迷宮裏面,蒜頭君想逃出去,可憐的蒜頭君連迷宮是否有能逃出去的路都不知道。

看在蒜頭君這麼可憐的份上,就請聰明的你告訴蒜頭君是否有可以逃出去的路。

輸入格式
第一行輸入兩個整數 nn 和 mm,表示這是一個 n \times mn×m 的迷宮。

接下來的輸入一個 nn 行 mm 列的迷宮。其中 ‘S’ 表示蒜頭君的位置,’*‘表示牆,蒜頭君無法通過,’.‘表示路,蒜頭君可以通過’.'移動,'T’表示迷宮的出口(蒜頭君每次只能移動到四個與他相鄰的位置——上,下,左,右)。

輸出格式
輸出一個字符串,如果蒜頭君可以逃出迷宮輸出"yes",否則輸出"no"。

數據範圍
1 \le n, m \le 101≤n,m≤10。

輸出時每行末尾的多餘空格,不影響答案正確性

樣例輸入1
3 4
S**.
…*.
*** T
樣例輸出1
no
樣例輸入2
3 4
S**.

***T
樣例輸出2
yes

簡單思路:

從初始位置S開始判斷,先定義兩個數組,用來控制它上下左右四個方位的移動,然後定義一個判斷數組,用於判斷該位置上的符號是否爲出口符號T。寫一個dfs函數來進行蒜頭君的移動,如果滿足行列的限制,且不走到牆上去,那麼就繼續行走,知道找到出口,或者無法走出迷宮之後停下來。位置數組一旦處於出口位置,便返回true並結束。

code:

#include<iostream>
using namespace std;
char mg[11][11];//位置
int n, m;

bool pd = false;//判斷
bool vis[11][11];//判斷數組
int dx[] = { -1,0,1,0 };//控制上下的數組
int dy[] = { 0,-1,0,1 };//控制左右的數組

void dfs(int x, int y)
{
	vis[x][y] = true;
	if (mg[x][y] == 'T')
	{
		pd = true;//出口位置返回true
		return ;
	}
	for (int i = 0; i < 4; i++)
	{
		int xt = x + dx[i];
		int yt = y + dy[i];
		if (xt < 0 || xt >= n || yt < 0 || yt >= m)//越界
			continue;
		if (vis[xt][yt]) 
			continue;
		if (mg[xt][yt] == '*') //撞牆
			continue;
		
		dfs(xt, yt);//遞歸調用dfs
	}
}
int main()
{
	cin >> n >> m;
	int i, j,h,l;
	for (i = 0; i < n; i++)
		for (j = 0; j < m; j++)
		{
			cin >> mg[i][j];
			if (mg[i][j] == 'S')
			{
				h = i;
				l = j;
			}
		}
	dfs(h, l);
	if (pd)
		cout << "yes" << endl;
	else
		cout << "no" << endl;
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章