具体题目到航电去看。
#include <iostream>
#include <queue>
#include<stdio.h>
using namespace std;
int Mark[50][50][50]; //标记是否已经到达过。
int Map[50][50][50];
int go[6][3] = {
1, 0, 0,
-1, 0, 0,
0, 1, 0,
0, -1, 0,
0, 0, 1,
0, 0, -1
};
struct State{
int x, y, z;
int t; //当前状态所花时间
};
queue<State> q; //error: 忘记清空队列,造成下一次循环受影响。
int A, B, C;
bool is_legal(int x, int y, int z){
if(x<0 || y<0 || z<0){
return false;
}
if(x>=A || y>=B || z>=C){
return false;
}
if(Mark[x][y][z]){
return false;
}
if(Map[x][y][z] == 1){ //error:忘记设置路障检查,并且错误地设置为!Map[x][y][z],这意味着有路反而不走。
return false;
}
return true;
}
int main(){ //error:本题的测试数据非常大,用cin可能会导致超时,所以以后有大数据输入的时候,可
以利用scanf节省时间。
int cnt;
scanf("%d", &cnt);
while(cnt--){
int T;
scanf("%d%d%d%d", &A, &B, &C, &T);
for(int i=0; i<A; i++){
for(int j=0; j<B; j++){
for(int k=0; k<C; k++){
Mark[i][j][k] = false;
scanf("%d", &Map[i][j][k]);
}
}
}
while(!q.empty()){
q.pop();
}
State initState;
initState.x = initState.y = initState.z = initState.t = 0;
q.push(initState);
int result = -1;
Mark[0][0][0] = true;
bool flag = true;
while(flag && !q.empty()){
State tmp;
tmp = q.front();
if(tmp.t == T){
break;
}
for(int i=0; i<6; i++){
if(is_legal(tmp.x+go[i][0], tmp.y+go[i][1], tmp.z+go[i][2])){
tmp.x = tmp.x+go[i][0];
tmp.y = tmp.y+go[i][1];
tmp.z = tmp.z+go[i][2];
tmp.t++;
Mark[tmp.x][tmp.y][tmp.z] = true;
if(Mark[A-1][B-1][C-1]){
flag = false;
result = tmp.t;
break;
}
q.push(tmp);
tmp = q.front();
}
}
q.pop();
}
printf("%d\n", result);
}
return 0;
}