#include <iostream> #include <queue> using namespace std; int n,m,si,sj,mini; int ma[9][9]; int rest[9][9]; int step[9][9]; int dir[4][2]={0,1,0,-1,-1,0,1,0}; queue<int> q; void bfs(int i,int j) { q.push(i*10+j); while(!q.empty()) { int front=q.front(); q.pop(); i = front/10; j = front%10; if(!rest[i][j]) continue ; if(ma[i][j]==3) { if(mini==-1||mini>step[i][j]) mini=step[i][j]; continue ; } else if(ma[i][j]==4) { rest[i][j]=6; ma[i][j]=0; } for(int k=0;k<4;k++) { int x=i+dir[k][0]; int y=j+dir[k][1]; if(x<0||x>=n||y<0||y>=m||!ma[x][y]||rest[x][y]>=rest[i][j]) continue; rest[x][y] = rest[i][j]-1; step[x][y] = step[i][j]+1; q.push(x*10+y); } } return ; } int main() {//freopen("in.txt","r",stdin); int t; cin>>t; while(t--) { mini=-1; cin>>n>>m; memset(ma,0,sizeof ma); memset(rest,0 ,sizeof rest); memset(step,0 ,sizeof step); for(int i = 0;i<n;i++) for(int j=0;j<m;j++) { cin>>ma[i][j]; if(ma[i][j]==2) { si=i; sj=j; } } ma[si][sj] = 0; rest[si][sj] = 6; bfs(si,sj); cout<<mini<<endl; } return 0; }
原文:http://blog.csdn.net/guodongxiaren/article/details/23552313