#include<iostream> #include<cstring> #include<algorithm> #include<queue> #include<stdio.h> #include<string.h> #include<cmath> using namespace std; int vist[4][2]={{1,0},{0,1},{-1,0},{0,-1}}; struct node{ int x,y,pre,bu; }; int main() { int times; cin>>times; while(times--) { int n,m,ti; cin>>n>>m>>ti; int mapp[101][101]; int book[101][101]={0}; int flag=0; for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) cin>>mapp[i][j]; struct node no[10001]; int frontt=0,next=1; int a,b; book[1][1]=1; no[frontt].x=1;no[frontt].y=1; no[frontt].pre=-1;no[frontt].bu=0; while(1){ int cnt=mapp[no[frontt].x][no[frontt].y]; for(int i=0;i<4;i++) { a=no[frontt].x+vist[i][0];b=no[frontt].y+vist[i][1]; int tem=mapp[a][b]; if(a<1||a>n||b<1||b>m||book[a][b]||abs(cnt-tem)>ti) continue; no[next].x=a; no[next].y=b; no[next].pre=frontt; no[next].bu=no[frontt].bu+1; book[a][b]=1; next++; // cout<<"*****"<<endl; if(a==n&&b==m) { flag=1;break; } if(next==n*m) { flag=-1;break; } } //cout<<next<<endl; if(flag!=0)break; frontt++; } if(flag==1) cout<<no[next-1].bu<<endl; else cout<<-1<<endl; } return 0; } |
Double click to view unformatted code.