【YBT高效进阶】1基础算法/5广度优先搜索/1走迷宫
内存限制:256 MiB
时间限制:1000 ms
标准输入输出
题目类型:传统
评测方式:文本比较
题目描述
现在有一个n*n的地图,问从起点(sx,sy)到(tx,ty)最少要走几步。
输入格式
第一行一个正整数n。
接下来n行,每行n个字符,表示 N*N 的 0/1 矩阵,1 表示不能通过,0 表示可以通过。
最后一行四个整数 sx,sy,tx,ty 。
输出格式
仅有一个数,表示答案。
样例
样例输入
5
01111
00111
10001
11101
11100
1 1 5 5
样例输出
8
数据范围与提示
对于 100% 的数据,有 n<=1000 。
思路
用BFS搜索,
保存坐标和步数。
如果到达终点,输出答案,结束程序。
代码
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
struct jgt
{
int x,y,s;
};
jgt b[1000010];
bool a[1010][1010];
int n,sx,sy,zx,zy,f[4][2]={{-1,0},{0,1},{1,0},{0,-1}};
void input()//输入
{
int i,j;
char t;
scanf("%d",&n);
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{
cin>>t;
a[i][j]=(t=='0');
}
scanf("%d%d%d%d",&sx,&sy,&zx,&zy);
if(sx==zx&&sy==zy)
{
printf("0");
exit(0);
}
return;
}
void BFS()
{
int i,l,r,dx,dy;
a[sx][sy]=0;
b[1].x=sx;
b[1].y=sy;
b[1].s=0;
for(l=r=1;l<=r;l++)
{
for(i=0;i<4;i++)//扩展
{
dx=b[l].x+f[i][0];
dy=b[l].y+f[i][1];
if (dx==zx&&dy==zy)//到达终点
{
printf("%d",b[l].s+1);
exit(0);
}
if (dx>=1&&dy>=1&&dx<=n&&dy<=n&&a[dx][dy])//判断越界,重复
{
r++;
b[r].x=dx;
b[r].y=dy;
b[r].s=b[l].s+1;
a[dx][dy]=0;
}
}
}
return;
}
int main()
{
int i;
input();
BFS();
return 0;
}