具体解释看代码批注。
#include<iostream>
#include <queue>
#include <string>
using namespace std;
int mp[6][6];
int vis[6][6];//用来标记是否走过的点;
int n,m;
int d[4][2] = {1,0,0,1,-1,0,0,-1};//方向,上下左右
struct node
{
int x,y,step;
};
int bfs()
{
memset(vis,0,sizeof(vis));
queue<node>q;
node s,e;
s.x = 0;//初始化坐标;
s.y = 0;
s.step = 0;//开始时走过的步数为0;
vis[s.x][s.y] = 1;//注意不要遗漏标记第一个点;
q.push(s);//加入起始点
while(!q.empty())//队列不为空;
{
e = q.front();//元素依次入队;
q.pop();//爆掉第一个元素;
if(e.x==4 && e.y==4)
{
return e.step;//走到头就over;
}
for(int i=0; i<4; i++)
{
s.x = e.x + d[i][0];//元素加入方向;
s.y = e.y + d[i][1];
s.step = e.step + 1;//步数加1;
if(s.x<0 || s.x>n-1 || s.y<0 || s.y>m-1 ||
mp[s.x][s.y]==1 || vis[s.x][s.y]==1) continue;//判断是否出界;
vis[s.x][s.y] = 1;
q.push(s);
}
}
return -1;
}
int main()
{
n=m=5;
int i,j;
for(i=0; i<n; i++)
{
for(j=0; j<m; j++)
{
scanf("%d",&mp[i][j]);
}
}
printf("%d\n",bfs());
return 0;
}