一道简单的01迷宫题,直接发代码
#include <iostream>
#include <cstring>
#include <cstdio>
#include <queue>
using namespace std;
const int maxn = 52;
const int dx[6] = {0,0,0,0,1,-1};
const int dy[6] = {0,0,-1,1,0,0};
const int dz[6] = {1,-1,0,0,0,0};
struct Point{
int x, y, z, s;
Point( int a, int b, int c, int d ) : x(a), y(b), z(c), s(d) {};
bool operator < ( const Point a ) const { return s > a.s; }
bool operator > ( const Point a ) const { return s < a.s; }
};
bool maps[maxn][maxn][maxn], vis[maxn][maxn][maxn], isget;
int sx, sy, sz, tim;
priority_queue<Point> que;
void init() {
isget = false;
memset(maps, 0, sizeof(maps));
memset(vis, 0, sizeof(vis));
while( !que.empty() ) que.pop();
}
void input() {
scanf("%d %d %d %d", &sz, &sx, &sy, &tim);
for( int i = 1; i <= sz; i++ )
for( int j = 1; j <= sx; j++ )
for( int k = 1; k <= sy; k++ )
scanf("%d", &maps[j][k][i]);
}
void solve() {
//BFS;
vis[1][1][1] = 1; //起点标记一下
que.push( Point( 1,1,1,0 ) );
while(!que.empty() && !isget) {
Point cur = que.top(); que.pop();
for( int i = 0; i < 6; i++ ) {
int tx = cur.x + dx[i], ty = cur.y + dy[i], tz = cur.z + dz[i];
if( tx < 1 || ty < 1 || tz < 1 || tx > sz || ty > sy || tz > sz ) continue;
if( vis[tx][ty][tz] || maps[tx][ty][tz] ) continue;
if( tx == sx && ty == sy && tz == sz ) {
isget = true;
if( cur.s+1 > tim ) break;
printf("%d\n", cur.s + 1);
return;
}
if( cur.s+1 > tim ) isget = true;
vis[tx][ty][tz] = 1;
que.push( Point(tx, ty, tz, cur.s+1) );
}
}
printf("-1\n");
}
int main() {
int T;
scanf("%d", &T);
while(T--) {
init();
input();
solve();
}
return 0;
}