#include<iostream>
#include<list>
using namespace std;
class coordinate
{
public:
int x,y,step;
coordinate(int xx,int yy,int s):x(xx),y(yy),step(s){}
};
int main()
{
list<coordinate>l;
int map[50][50]={0},visited[50][50]={0};
int row,col,start_x,start_y,flag=0,direction,target_x,target_y,i,j,next_x,next_y;
cin>>row>>col;
for(i=0;i<row;i++)
for(j=0;j<col;j++)
cin>>map[i][j];
cin>>start_x>>start_y>>target_x>>target_y;
l.push_back(coordinate(start_x,start_y,0));//initialize
visited[start_x][start_y]=1;
while(!l.empty())
{
for(direction=0;direction<=3;direction++)//0:upward 1:leftward 2:downward 3:rightward
{
next_x=l.front().x;
next_y=l.front().y;
switch(direction)
{
case 0:next_y=l.front().y-1;break;
case 1:next_x=l.front().x-1;break;
case 2:next_y=l.front().y+1;break;
case 3:next_x=l.front().x+1;break;
}
if(next_x<0||next_y<0||next_x>=row||next_y>=col)//boundary condition
continue;
else if(map[next_x][next_y]==0&&visited[next_x][next_y]==0)
{
visited[next_x][next_y]=1;
l.push_back(coordinate(next_x,next_y,l.front().step+1));
}
if(next_x==target_x&&next_y==target_y)//break condition
{
flag=1;
break;
}
}
if(flag==1)
break;
l.pop_front();
}
cout<<l.back().step<<endl;
return 0;
}
BFS(Breadth First Search)
最新推荐文章于 2025-03-03 17:42:40 发布