题目
源地址:
http://poj.org/problem?id=2251
理解
拖了好久的三维BFS题。天真的觉得pair类可以直接扩展到三维中去,结果编译器直接报了错,可惜了那么多的代码,全都要推倒重来了。借鉴了某个神牛的写法,特别是在输入上面,顿时感觉以前的处理方法姿势太不优美了。做这类题目的时候,经常有一个困扰就是我的记步器如何实现,从前都是单独设一个steps这样的变量,现在看来,每一个点设一个可能更好理解一点。
代码
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <ctime>
#include <iostream>
#include <algorithm>
#include <string>
#include <vector>
#include <deque>
#include <list>
#include <set>
#include <map>
#include <stack>
#include <queue>
#include <numeric>
#include <iomanip>
#include <bitset>
#include <sstream>
#include <fstream>
#define debug puts("-----")
#define pi (acos(-1.0))
#define eps (1e-8)
#define inf (1<<28)
#define MAXN 35
using namespace std;
#define MAX_NUM 31
class Node
{
public:
int l, r, c;
int time;
public:
bool operator==(const Node &rhs) const
{
return l == rhs.l && r == rhs.r && c == rhs.c;
}
};
int layer, row, col;
Node start, end;
bool dic[MAX_NUM][MAX_NUM][MAX_NUM];
bool flag[MAX_NUM][MAX_NUM][MAX_NUM];
int steps[6][3] = { {0, 0, 1}, {0, 0, -1}, {0, 1, 0}, {0, -1, 0}, {1, 0, 0}, { -1, 0, 0} };
bool CheckValid(const Node &node)
{
int l = node.l, r = node.r, c = node.c;
if (l >= 0 && l < layer
&& r >= 0 && r < row
&& c >= 0 && c < col
&& dic[l][r][c])
{
return true;
}
return false;
}
int TBFS()
{
int i;
queue<Node> q;
q.push(start);
flag[start.l][start.r][start.c] = 1;
while (!q.empty())
{
Node tmp = q.front();
q.pop();
for (i = 0; i < 6; ++i)
{
Node node = tmp;
node.l += steps[i][0];
node.r += steps[i][1];
node.c += steps[i][2];
if (CheckValid(node) && !flag[node.l][node.r][node.c])
{
++node.time;
flag[node.l][node.r][node.c] = 1;
q.push(node);
if (node == end)
{
return node.time;
}
}
}
}
return 0;
}
int main(int argc, char const *argv[])
{
int i, j, k;
char ch;
while (1)
{
Node tmp;
scanf ("%d %d %d%*c", &layer, &row, &col); //注意这里的一个小小细节,%*c用来忽略输入后面的那个回车,学习了。
if (!layer && !row && !col)
break;
for (i = 0; i < layer; ++i)
{
for (j = 0; j < row; ++j)
{
for (k = 0; k < col; ++k)
{
ch = getchar();
if (ch == '#')
{
dic[i][j][k] = 0;
}
else if (ch == '.')
{
dic[i][j][k] = 1;
}
else if (ch == 'S')
{
start.l = i;
start.r = j;
start.c = k;
start.time = 0;
dic[i][j][k] = 1;
}
else if (ch == 'E')
{
end.l = i;
end.r = j;
end.c = k;
end.time = 0;
dic[i][j][k] = 1;
}
}
getchar ();
}
getchar ();
}
memset(flag, 0, sizeof(flag));
int ret = TBFS();
if (ret)
{
printf ("Escaped in %d minute(s).\n", ret);
}
else
{
printf ("Trapped!\n");
}
}
return 0;
}
更新日志
- 2014年08月22日 已AC。