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;
}