给定迷宫,深搜求向左搜索和向右搜索走出迷宫需要的步数,广搜求走出迷宫最少的步数。
注意方向数组,还有横纵坐标。
#include <iostream>
#include <cstdio>
#include <queue>
#include <cstring>
using namespace std;
int w, h, dist[45][45];
char maze[45][45];
struct point { int x, y; } s;
int dir[4][2] = {{0, 1}, {-1, 0}, {0, -1}, {1, 0}};
int bfs()
{
memset (dist, 0, sizeof (dist));
queue <point> q;
q.push(s);
dist[s.y][s.x] = 1;
while (!q.empty()) {
point cur = q.front();
q.pop();
for (int i = 0; i <= 3; i++) {
point nxt;
nxt.x = cur.x + dir[i][0];
nxt.y = cur.y + dir[i][1];
if (!dist[nxt.y][nxt.x] && nxt.x >= 0 && nxt.x < w && nxt.y >= 0 && nxt.y < h && maze[nxt.y][nxt.x] != '#') {
dist[nxt.y][nxt.x] = dist[cur.y][cur.x] + 1;
if (maze[nxt.y][nxt.x] == 'E') return dist[nxt.y][nxt.x];
q.push(nxt);
}
}
}
}
int dfs(int x, int y, int toward, char ch)
{
if (maze[y][x] == 'E') return 1;
int tx, ty, i, to;
if (ch == 'l') {
for (i = toward - 1; i <= toward + 2; i++) { //注意该怎样循环
to = (i + 4) % 4; //to表示的是下次搜索时的方向,上右下左对应的to指分别为0 1 2 3;
//同时 to 又表示本次搜索的方向数组的下标,要达到这两个目的则需要循环方式和方向数组的配合
tx = x + dir[to][0]; ty = y + dir[to][1];
if (tx >= 0 && tx < w && ty >= 0 && ty < h && maze[ty][tx] != '#')
return 1 + dfs (tx, ty, to, ch);
}
}
else if (ch == 'r') {
for (i = toward + 1; i >= toward - 2; i--) {
to = (i + 4) % 4;
tx = x + dir[to][0]; ty = y + dir[to][1];
if (tx >= 0 && tx < w && ty >= 0 && ty < h && maze[ty][tx] != '#')
return 1 + dfs (tx, ty, to, ch);
}
}
}
int main()
{
int n, i, j;
bool mark;
scanf ("%d", &n);
while (n--) {
scanf ("%d%d", &w, &h);
getchar();
mark = false;
for (i = 0; i < h; i++) {
gets(maze[i]);
for (j = 0; j < w && !mark; j++)
if (maze[i][j] == 'S') {
s.x = j; s.y = i; mark = true;
}
}
int toward;
if (s.y == 0) toward = 0;
else if (s.x == w - 1) toward = 1;
else if (s.y == h - 1) toward = 2;
else toward = 3;
printf ("%d %d %d\n", dfs(s.x, s.y, toward, 'l'), dfs(s.x, s.y, toward, 'r'), bfs());
}
return 0;
}