这题数据真的是太弱了吧。。。我开始用认为是错误的代码提交就AC了,但一直不知道哪里的问题。。。最后发现判断的条件反了。。。。不知道为什么反过来也行。。。。。
这题主要是要通过判断是否时间比之前的多来防止无休止的循环。
代码如下:
#include <iostream>
#include <cstring>
#include <queue>
using namespace std;
typedef struct{
int x;
int y;
int step;
int time;
} Point;
int T, N, M;
int map[9][9];
int mark[9][9];
int moves[4][2] = { 1, 0, -1, 0, 0, 1, 0, -1 };
Point begins;
void BFS(){
queue<Point> q;
q.push( begins );
mark[begins.x][begins.y] = begins.time;
while( !q.empty() ){
Point p;
p = q.front();
q.pop();
for( int i = 0; i < 4; i++ ){
Point temp = p;
temp.x += moves[i][0];
temp.y += moves[i][1];
temp.step++;
temp.time--;
//下面的里面改成temp.x > M || temp.y > N竟然也能过.....太神奇了....
if( temp.x < 0 || temp.x >= N || temp.y >= M || temp.y < 0 || temp.time <= 0 || map[temp.x][temp.y] == 0 ){
continue;
}
if( map[temp.x][temp.y] == 3 && temp.time > 0 ){
cout << temp.step << endl;
return;
}else if( map[temp.x][temp.y] == 4 ){
temp.time = 6;
}
if( mark[temp.x][temp.y] < temp.time ){
mark[temp.x][temp.y] = temp.time;
q.push( temp );
}
}
}
cout << -1 << endl;
}
int main(){
cin >> T;
while( T-- ){
cin >> N >> M;
memset( map, 0, sizeof( map ) );
for( int i = 0; i < N; i++ ){
for( int j = 0; j < M; j++ ){
cin >> map[i][j];
if( map[i][j] == 2 ){
begins.x = i;
begins.y = j;
begins.step = 0;
begins.time = 6;
}
mark[i][j] =0;
}
}
BFS();
}
return 0;
}