#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <queue>
using namespace std;
int n,m;
bool flag[105][105];
int mm[105][105];
int ans[105][105];
struct qq{
int x,y,z;
};
queue <qq> q;
void add_q(int x,int y,int z){
qq tq;
tq.x=x; tq.y=y; tq.z=z;
q.push(tq);
ans[x][y]=z;
flag[x][y]=false;
}
int main(){
int k;
scanf("%d",&k);
while(k-- >0){
scanf("%d %d",&n,&m);
for(int i=0;i<n;i++)
for(int j=0;j<m;j++){
scanf("%d",&mm[i][j]);
flag[i][j]=true;
}
//q.clear();
while(!q.empty())
q.pop();
qq qqq;
qqq.x=0; qqq.y=0; qqq.z=0;
q.push(qqq);
ans[0][0]=0;
flag[0][0]=false;
//bfs
int x=0,y=0;
int now=0;
while(flag[n-1][m-1]){
while(now==q.front().z){
x=q.front().x;
y=q.front().y;
q.pop();
//up
if(x-1>=0)
if(flag[x-1][y] && abs(mm[x][y]-mm[x-1][y])<=5)
add_q(x-1,y,now+1);
//left
if(y-1>=0)
if(flag[x][y-1] && abs(mm[x][y]-mm[x][y-1])<=5)
add_q(x,y-1,now+1);
//down
if(x+1<n)
if(flag[x+1][y] && abs(mm[x][y]-mm[x+1][y])<=5)
add_q(x+1,y,now+1);
//right
if(y+1<m)
if(flag[x][y+1] && abs(mm[x][y]-mm[x][y+1])<=5)
add_q(x,y+1,now+1);
}
now++;
}
printf("%d\n",ans[n-1][m-1]);
}
}
2015年1月28日 星期三
TIOJ 1022 H.跑跑卡恩車
訂閱:
張貼留言 (Atom)
沒有留言:
張貼留言