洛谷-AT1350-深度优先搜索

【小韦同学@洛谷-AT1350-深度优先搜索】

题目:

描述

高桥先生住的小区是长方形的,被划分成一个个格子。高桥先生想从家里去鱼店,高桥先生每次可以走到他前后左右四个格子中的其中一个,但不能斜着走,也不能走出小区。
现在给出地图:
s:代表高桥先生的家
g:代表鱼店
.:代表道路
#:代表墙壁
高桥先生不能穿过墙壁。

输入

第一行输入n(1<=n<=500),m(1<=m<=500)代表小区的长和宽,接下来n行每行m个字符,描述小区中的每个格子。

输出

如果高桥先生能到达鱼店,输出"Yes",否则输出"No"。

输入样例#1:

4 5
s####
…#

#…g

输出样例#1:

No

输入样例#2:

4 4
…s


.g…

输出样例#2:

Yes

输入样例#3:

10 10
s…
#########.
#…#.
#…####.#.
##…#.#.
#####.#.#.
g.#.#.#.#.
#.#.#.#.#.
###.#.#.#.
#…#…

输出样例#3:

No

输入样例#4:

10 10
s…
#########.
#…#.
#…####.#.
##…#.#.
#####.#.#.
g.#.#.#.#.
#.#.#.#.#.
#.#.#.#.#.
#…#…

输出样例#4:

Yes

输入样例#5:

1 10
s…####…g

输出样例#5:

No

题解:

/*********************************************************************

* 题目:洛谷-AT1350-深度优先搜索 
* 作者:小韦同学
* 邮箱:[email protected]

* 题解:
	思路:
	显然,该题要用DFS来实现。 
	对于当前点来说,若是终点,则直接返回true,若不是,则标记该点为已访
	问,然后按照一定的方向(如上下左右)找到相邻的四个点,对于这些点,
	需判断:
	①点是否越界
	②点是否为墙壁
	③是否未访问
	若以上三个条件均符合,则对之进行DFS,若为true,则返回true。 
	注意: 
	该题DFS的最后不需要回溯,只需返回false即可。 
	
*********************************************************************/

#include 

using namespace std;

const int N = 510;
string maze[N];  // 存储地图 
bool vis[N][N];  // 标记访问 
int n, m;  // 地图的行和列 
// 方向数组 
int dir[4][2] = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};


// 判断当前坐标是否越界 
bool in(int x, int y) {
	return 0 <= x && x < n && 0 <= y && y < m;
}

bool dfs(int x, int y) {
	// 若到达终点,则返回true 
	if (maze[x][y] == 'g') return true;
	vis[x][y] = true;  // 标记为已访问 
	for (int i = 0; i < 4; i++) {
		// 从当前点往下一个点 
		int tx = x + dir[i][0];
		int ty = y + dir[i][1];
		// (tx, ty)这个点没有越界,不是墙,并且还没有被访问过 
		if (in(tx, ty) && maze[tx][ty] != '#' && !vis[tx][ty]) {
			// 若(tx, ty)这个点能到终点,能返回true 
			if (dfs(tx, ty)) return true;
		}
	}
	//  不需要回溯,因为运行到此时,已经搜完了 
//	vis[x][y] = false;
	// 能进行到这里,说明不能走到终点,返回false 
	return false;
}

int main() {

	cin >> n >> m;
	// 输入地图 
	for (int i = 0; i < n; i++) {
		cin >> maze[i];
	}
	int x, y;  //  代表起点坐标
	//  找起点坐标 
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < m; j++) {
			if (maze[i][j] == 's') {
				x = i;
				y = j;
			}
		}
	}
	if (dfs(x, y)) cout << "Yes";
	else cout << "No";
	
	return 0;
}

我是小韦同学,企者不立,跨者不行,每天进步一点点。
欢迎大家多多交流,如果发现有错误,请多指正。有疑问的同学也可以留言评论或者发邮件。
邮箱:[email protected]

你可能感兴趣的:(小韦同学@题解:洛谷)