解題心得
除了東西南北外,多考慮上下的bfs。
程式碼
#include <iostream>
#include <queue>
using namespace std;
struct Point
{
int level, x, y, step = -1;
};
int l, r, c;
char map[31][31][31];
int main()
{
while (cin >> l >> r >> c)
{
if (l == 0 && r == 0 && c == 0) break;
bool isVisit[31][31][31] = { false };
Point start, end, now;
for (int i = 0; i < l; i++)
{
for (int j = 0; j < r; j++)
{
for (int k = 0; k < c; k++)
{
cin >> map[i][j][k];
if (map[i][j][k] == 'S')
start.level = i, start.x = j, start.y = k;
if (map[i][j][k] == 'E')
end.level = i, end.x = j, end.y = k;
}
}
cin.ignore();
}
queue<Point> q;
start.step = 0;
q.push(start);
isVisit[start.level][start.x][start.y] = true;
bool isValid = false;
while (!q.empty())
{
now = q.front(); q.pop();
//cout << now.level << " " << now.x << " " << now.y << " " << now.step << endl;
if (map[now.level][now.x][now.y] == 'E')
{
cout << "Escaped in " << now.step << " minute(s)." << endl;
isValid = true;
break;
}
if (now.x - 1 >= 0 && map[now.level][now.x - 1][now.y] != '#' && !isVisit[now.level][now.x - 1][now.y])
{
isVisit[now.level][now.x - 1][now.y] = true;
Point p; p.level = now.level; p.x = now.x - 1; p.y = now.y;
p.step = now.step + 1;
q.push(p);
}
if (now.x + 1 < r && map[now.level][now.x + 1][now.y] != '#' && !isVisit[now.level][now.x + 1][now.y])
{
isVisit[now.level][now.x + 1][now.y] = true;
Point p; p.level = now.level; p.x = now.x + 1; p.y = now.y;
p.step = now.step + 1;
q.push(p);
}
if (now.y - 1 >= 0 && map[now.level][now.x][now.y - 1] != '#' && !isVisit[now.level][now.x][now.y - 1])
{
isVisit[now.level][now.x][now.y - 1] = true;
Point p; p.level = now.level; p.x = now.x; p.y = now.y - 1;
p.step = now.step + 1;
q.push(p);
}
if (now.y + 1 < c && map[now.level][now.x][now.y + 1] != '#' && !isVisit[now.level][now.x][now.y + 1])
{
isVisit[now.level][now.x][now.y + 1] = true;
Point p; p.level = now.level; p.x = now.x; p.y = now.y + 1;
p.step = now.step + 1;
q.push(p);
}
if (now.level - 1 >= 0 && map[now.level - 1][now.x][now.y] != '#' && !isVisit[now.level - 1][now.x][now.y])
{
isVisit[now.level- 1][now.x][now.y ] = true;
Point p; p.level = now.level - 1; p.x = now.x; p.y = now.y;
p.step = now.step + 1;
q.push(p);
}
if (now.level + 1 < l && map[now.level + 1][now.x][now.y] != '#' && !isVisit[now.level + 1][now.x][now.y])
{
isVisit[now.level + 1][now.x][now.y] = true;
Point p; p.level = now.level + 1; p.x = now.x; p.y = now.y;
p.step = now.step + 1;
q.push(p);
}
isVisit[now.level][now.x][now.y] = true;
}
if (!isValid) cout << "Trapped!" << endl;
}
return 0;
}
沒有留言:
張貼留言