总算期中考了,鄙人被教育局分配到了SY学校,当然是陪着很多人的。不知转了多少次车,总算到了。可惜的是,SY学校整个像个迷宫一样,就在门口贴了张学校地图。鄙人就开始研究地图了,但是学校错综复杂,等找到目的地,早就开考了。为此,鄙人取出随身携带的微型电脑(不知道从哪来的),向网上发去了求助书。注:只能往4个方向走:上、下、左、右。
input:
第1行,二个数,N,M。
接下来是一个N*M的矩阵,表示这个学校。(有N行,M列)。矩阵由2个数字组成。0:路;1:墙。路能走,墙不能走(这是基本常识。不过还是提醒一下,不然哪个牛又要飞檐走壁了)。
再是2行,第1行2个数X1,Y1表示校门口的坐标(即校门口在矩阵的第X1行,第Y1列)。第2行2个数X2,Y2表示鄙人的考场的坐标(即校门口在矩阵的第X2行,第Y2列)。
数据范围:0<M,N<=2000。0〈X1,X2〈=N,0〈Y1,Y2〈=M。
output:
一个数,表示最少要走的步数。如果走不到,则输出 No Answer!
input:
5 5
1 1 1 1 1
1 1 1 0 0
1 0 0 0 1
0 0 1 0 0
1 1 1 0 1
4 1
5 4
output:
6
【参考程序】:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
using namespace std;
const int dx[5]={0,-1,0,1,0};
const int dy[5]={0,0,1,0,-1};
struct node
{
int x,y,dep;
};
node list[4000010];
int map[2010][2010];
int head,tail,n,m,i,j,x1,y1,x2,y2,xx,yy;
bool bk;
bool tf(int xx,int yy)
{
if ((xx>=1)&&(xx<=n)&&(yy>=1)&&(yy<=m)&&(map[xx][yy]==0))
return true;
else return false;
}
int main()
{
scanf("%d%d",&n,&m);
for (i=1;i<=n;i++)
for (j=1;j<=m;j++)
scanf("%d",&map[i][j]);
scanf("%d%d",&x1,&y1);
scanf("%d%d",&x2,&y2);
list[1].x=x1;list[1].y=y1;
list[1].dep=0;
map[x1][y1]=1;
bk=false;
head=1;tail=1;
while (head<=tail)
{
for (i=1;i<=4;i++)
{
xx=list[head].x+dx[i];
yy=list[head].y+dy[i];
if (tf(xx,yy))
{
tail++;
list[tail].x=xx;list[tail].y=yy;
list[tail].dep=list[head].dep+1;
map[xx][yy]=1;
if ((list[tail].x==x2)&&(list[tail].y==y2))
{
bk=true;
break;
}
}
}
if (bk==true) break;
head++;
}
if (!bk) printf("No Answer!/n");
else printf("%d/n",list[tail].dep);
return 0;
}