DFS走迷宫 | ||
---|---|---|
Time Limit: 1000 MS | Memory Limit: 1000 KB |
Description
在一个n*m的有起点和终点的二维地图中找出起点终点的最短路
‘#’、’.’、‘S’、'G’分别表示墙壁、通道、起点、终点
保证输入合法,且结果不超过int范围, 地图中一点只与上下左右4个点相邻。
Input
输入的第一行是一个int型整数T,表示一个有T组数据。
每组数据第一行包含两个数n<=100,m<=100 表示二维地图的行数,列数。
接下来有n行,表示地图。
Output
输出T行,每行一个整数,表示求得的结果。如果起点终点连通,输出exist!,否则,输出not exist!.
Sample Input
2
10 10
#S######.#
......#..#
.#.##.##.#
.#........
##.##.####
....#....#
.#######.#
....#.....
.####.###.
....#...G#
10 10
#S######.#
#.#...####
.#.##.##.#
.#........
##.##.####
....#....#
.#######.#
....#.....
.####.###.
....#...G#
Sample Output
exist!
not exist!
代码结果:
#include<iostream>
using namespace std;
bool a[101][101];
char b[101][101]; //存放迷宫
int flag = 0; //如果能走出去就标记为1,反之为0
int xx[4] = { 0, -1,0,1 }, yy[4] = { -1,0,1,0 };
int n, m, kx, ky; //n是迷宫的边长,kx是x进行加减之后的值,同理ky。
void dfs(int x, int y)
{
for (int i = 0; i <= 3; i++)
{
kx = x + xx[i];
ky = y + yy[i];
if ((b[kx][ky] == '.' || b[kx][ky] == 'G') && kx >= 0 && ky >= 0 && kx < n && ky < m && a[kx][ky] == 0)
{
a[kx][ky] = 1;
if (b[kx][ky] == 'G')
{
flag = 1;
}
else
{
dfs(kx, ky);
}
}
}
}
int main() {
int T = 0;
cin >> T;
for (int t = 0; t < T; t++)
{
for (int p = 0; p < 101; p++)
for (int q = 0; q < 101; q++)
{
a[p][q] = 0;
}
cin >> n; cin >> m;
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
cin >> b[i][j];
}
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
{
if (b[i][j] == 'S')
dfs(i, j);
}
}
if (flag == 1) {
cout << "exist!" << endl;
flag = 0;
}
else {
cout << "not exist!" << endl;
}
}
return 0;
}