运动队列性质,先将起点入队,从队首开始遍历,(再从起点出发),运动方向为上下左右,并要在图范围内和并未走过的点,符合要求就入队,并step = 队首.step+1;
一直循环遍历,遍历条件为队列.empty != 0;
直到到达终点停止;输出step;
好
上码!!!!!
#include <iostream> #include <queue> using namespace std; struct node{ int x; int y; int step; }; int dx[4] = {-1,1,0,0}; //左 右 上 下 int dy[4] = {0,0,-1,1}; int a[50][50];//1表示空地,2表示障碍地 int v[50][50];//0表示未访问,1表示已访问 queue<node> r; int main() { /* 5 4 1 1 2 1 1 1 1 1 1 1 2 1 1 2 1 1 1 1 1 2 1 1 4 3 */ int n,m,startx,starty,p,q; int i,j; int flag; scanf("%d%d",&n,&m); for(i=1;i<=n;i++) for(j=1;j<=m;j++) scanf("%d",&a[i][j]); scanf("%d%d%d%d",&startx,&starty,&p,&q); node start; start.x = startx; start.y = starty; start.step = 0; r.push(start); v[startx][starty] = 1; while(!r.empty()) { int x = r.front().x,y = r.front().y; if(x==p&&y==q) { flag = 1; printf("%d",r.front().step); break; } for(int k=0;k<4;k++) { int tx,ty; tx = x + dx[k]; ty = y + dy[k]; if(tx<0||ty<0) continue;//直接省略 if(a[tx][ty]==1&&v[tx][ty] == 0) //可通过并为走过 { node next; next.x = tx; next.y = ty; next.step = r.front().step+1; v[tx][ty] = 1; r.push(next); } } r.pop(); } if(flag==0) printf("no anwer!"); return 0; }