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>
#include<queue>
#include<math.h>
#include<utility>
using namespace std;
//用一个点记录当前位置
struct Point {
int x, y;
void set(int x, int y) {
this->x = x;
this->y = y;
}
};char maze[100][100];
Point p1;
//起点
Point p2;
// 终点
Point MOVE[4] = { {-1,0},{0,-1},{0,1},{1,0} };
//四个方向的偏移量 :上、左、右、下
//迷宫初始化
void init() {
int a, b;
cin>>a>>b;
for (int i = 0; i < a; i++) {
for (int j = 0; j < b; j++) {
maze[i][j] = '#'; //全部设置为墙壁,注意此迷宫比题目所给多初始化了一圈墙壁
}
}
//确定迷宫大小
for (int i = 1; i <= a; i++) {
for (int j = 1; j <= b; j++) {
cin >> maze[i][j];
if (maze[i][j] == 'S') {
p1.set(i, j); //设置起点
}
if (maze[i][j] == 'G') {
p2.set(i, j); //设置终点
}
}
}
}
//路径查找
void findpath() {
queue<Point> p;
//队用于遍历迷宫
Point cur, nxt;
//起点初始化队
p.push(p1);
//起点,初始化对应的值为 'a'
maze[p1.x][p1.y] = 'a';
while (!p.empty()) {
cur = p.front();
p.pop();
//考察每一个相邻的其他位置
for (int i = 0; i < 4; i++) {
nxt.x = cur.x + MOVE[i].x;
nxt.y = cur.y + MOVE[i].y;
if (maze[nxt.x][nxt.y] == '.') {//不是墙壁,修改迷宫标记为走过的总长度
maze[nxt.x][nxt.y] = maze[cur.x][cur.y] + 1;
p.push(nxt);
}
if (maze[nxt.x][nxt.y] == 'G') {
p.push(nxt);
break; //已到终点
}
}
if (maze[nxt.x][nxt.y] == 'G') {
p.push(nxt);
break; //已到终点
}
}
if (!p.empty()) {
cout << "exist!" << endl;
}
else { cout << "not exist!" << endl; }
}
int main() {
// 初始化样例
int T;
cin >> T;
for (int i = 0; i < T; i++) {
init();
findpath();
}
return 0;
}