/*<br />看來是真的很水,以前寫過的題目在寫的話TLE<br />只記得hash 裡面要弄個6, 以前會AC,但不代表你現在會<br />這個hash[sx][sy] = 6 真的是一個很好的方法<br />*/#include <iostream><br />#include <cstdio><br />#include <cstring><br />#include <queue><br />using namespace std;<br />const int N = 12;<br />int hash[N][N];<br />int map[N][N];<br />struct node<br />{<br />int x, y, step;<br />node (){};<br />node (int xx, int yy, int st): x(xx), y(yy), step(st){};<br />};<br />int dx[] = {0, 0, 1, -1};<br />int dy[] = {1, -1, 0, 0};<br />int n, m;<br />void BFS(int sx, int sy, int ex, int ey)<br />{<br />node now, next;<br />queue<node> Q;<br />Q.push(node(sx, sy, 0));<br />hash[sx][sy] = 6; // 起點時間為6<br />while(!Q.empty())<br />{<br />now = Q.front();<br />Q.pop();<br />for(int i = 0; i < 4; i++)<br />{<br />next = now;<br />next.x = now.x + dx[i];<br />next.y = now.y + dy[i];<br />if(next.x < 0 || next.x >= n || next.y < 0 || next.y >= m || hash[now.x][now.y] <= 1 || map[next.x][next.y] == 0)<br />continue;<br />next.step = now.step + 1;<br />if(map[next.x][next.y] == 3)<br />{<br />printf("%d/n", next.step);<br />return ;<br />}<br />if(hash[next.x][next.y] < hash[now.x][now.y] - 1)<br />{ // next點離爆炸的時間比 now的爆炸的時間短的話才入隊列<br />hash[next.x][next.y] = hash[now.x][now.y] - 1;<br />if(map[next.x][next.y] == 4)<br />{<br />hash[next.x][next.y] = 6;<br />//next.time = 6;<br />}<br />Q.push(next);<br />}</p><p>}<br />}<br />printf("-1/n");<br />return ;<br />}<br />int main()<br />{<br />//freopen("hxsh.in", "r", stdin); // 建一個這樣的檔案,就不要整天複製了<br />int t;<br />scanf("%d", &t);<br />while(t--)<br />{<br />scanf("%d %d", &n, &m);<br />int sx, sy, ex, ey;<br />for(int i = 0; i < n; i++)<br />for(int j = 0; j < m; j++)<br />{<br />hash[i][j] = 0;<br />scanf("%d", &map[i][j]);<br />if(map[i][j] == 2)<br />{<br />sx = i;<br />sy = j;<br />}<br />if(map[i][j] == 3)<br />{<br />ex = i;<br />ey = j;<br />}<br />}<br />BFS(sx, sy, ex, ey);<br />}<br />}
/*
方法借鑒了hdOj論壇,沒有處理過可以往回走的題目,所以處理起來很棘手,
第一次爆記憶體了,對於輸出是-1的情況的,我起初考慮的是有點問題的,但是不知怎麼解決
後來看了論壇,想想應該是自己的代碼造成死迴圈的緣故吧。
bfs的變形真的讓人有點那個的。。
*/
#include<iostream>//2399633 2010-04-29 19:31:23 Accepted 1072 0MS 292K 1915 B C++ 悔惜晟
#include<cstdio>
#include<cmath>
#include<queue>
using namespace std;
int si, sj;
int ei, ej;
int num;
int n, m;
char map[10][10];
int hash[10][10];//這個hash 有點帥。。。
int dir[4][2] = { {1, 0}, {-1, 0}, {0, 1}, {0, -1} };
struct node
{
int time;
int x;
int y;
//int count;
};
int bfs(int sx, int sy)
{
node N, P;
int i;
queue<node>q;
N.x = sx;
N.y = sy;
N.time = 0;
hash[N.x][N.y] = 6;//完美的處理
//N.count = 6;
q.push(N);
while(!q.empty())
{
N = q.front();
/*
if(N.x == ei && N.y == ej && hash[N.x][N.y] > 0)
{
printf("%d/n", N.time);
return 1;
}
*/
/*
if(N.time >= num)
{
break;
}
*/
q.pop();
for(i = 0; i < 4; i++)
{
P.x = N.x + dir[i][0];
P.y = N.y + dir[i][1];
//P.count = N.count - 1;
P.time = N.time + 1;
if(hash[N.x][N.y] <= 1 || P.x < 0 || P.x >= n || P.y < 0 || P.y >= m || map[P.x][P.y] == '0')
continue;
/*
if(map[P.x][P.y] == '1' || map[P.x][P.y] == '3')
{
q.push(P);
if(hash[P.x][P.y] < hash[N.x][N.y] - 1)
hash[P.x][P.y] = hash[N.x][N.y] - 1;
}
*/
if(map[P.x][P.y] == '3')
{
printf("%d/n", P.time);
return 1;
}
if(hash[P.x][P.y] < hash[N.x][N.y] - 1)
{
hash[P.x][P.y] = hash[N.x][N.y] - 1;
if(map[P.x][P.y] == '4')
{
//P.count = 6;
hash[P.x][P.y] = 6;
//q.push(P);
}
q.push(P);
}
}
}
printf("-1/n");
return 1;
}
int main()
{
int T;
int i, j;
cin>>T;
while(T--)
{
cin>>n>>m;
for(i = 0; i < n; i++)
for(j = 0 ; j <m; j++)
{
cin>>map[i][j];
//hash[i][j] = 6;
if(map[i][j] == '2')
{
si = i;
sj = j;
}
if(map[i][j] == '3')//沒有用的
{
ei = i;
ej = j;
}
}
//num =2 * (int)(abs(1.0 * si - ei) +abs(1.0 * sj - ej));
memset(hash, -1, sizeof(hash));
bfs(si, sj);
}
}