输入:
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
输出:
7
#include<bits/stdc++.h>
using namespace std;
int a[100][100],v[100][100]; //v是访问数组
struct point
{
int x;
int y;
int step;
};
queue<point> r; //申请队列
const int dx[4]={0,0,+1,-1};
const int dy[4]={+1,-1,0,0};
int main()
{
int n,m,startx,starty,p,q;
cin>>n>>m;
for(int i=1;i<=n;++i)
for(int j=1;j<=m;++j)
cin>>a[i][j];
cin>>startx>>starty>>p>>q; //输入起始和终点坐标
point start; //定义了一个结构体类型为start
start.x=startx;
start.y=starty;
start.step=0;
r.push(start); //将起点入队
v[startx][starty]=1;
int flag=0;
while(!r.empty())
{
int x=r.front().x,y=r.front().y;
if(x==p&&y==q) //如果达到了终点
{
flag=1;
cout<<r.front().step;
break;
}
for(int k=0;k<=3;++k)
{
int tx,ty;
tx=x+dx[k];
ty=y+dy[k];
if(a[tx][ty]==1&&v[tx][ty]==0)
{
//当a[tx][ty]=1时为空地,所以不需要再加一个边界判断了
//入队
point temp; //创建一个临时的结构体变量来储存
temp.x=tx;
temp.y=ty;
temp.step=r.front().step+1;
r.push(temp);
v[tx][ty]=1;
}
}
r.pop(); //拓展完了需要将对首元素出队
}
if(flag==0)
cout<<"no answer"<<endl;
return 0;
}