队列我有写过一篇题解来说明,见:【C++广度搜索入门】面积
这是我的第二篇广搜题解,可能仍有众多不足,请大家多指教,欢迎与我讨论
时间限制: 1 Sec 内存限制: 128 MB
题目描述
铁塔尼号遇险了!他发出了求救信号。距离最近的哥伦比亚号收到了讯息,时间就是生命,必须尽快赶到那里。
通过侦测,哥伦比亚号获取了一张海洋图。这张图将海洋部分分化成n*n个比较小的单位,其中用1标明的是陆地,用0标明是海洋。船只能从一个格子,移到相邻的四个格子。
为了尽快赶到出事地点,哥伦比亚号最少需要走多远的距离。
输入
第一行为n,下面是一个n*n的0、1矩阵,表示海洋地图
最后一行为四个小于n的整数,分别表示哥伦比亚号和铁塔尼号的位置。
输出
哥伦比亚号到铁塔尼号的最短距离.
样例输入
3 001 101 100 1 1 3 3
样例输出
4
提示
N<=1000
输入那里我卡了很久,请注意输入的处理
#include
using namespace std;
struct hhh
{
int h,l,s;//行,列,步数
}qwq[1000005];
int jz[1005][1005]={0},vis[1005][1005]={0};
int main()
{
int bh[4][2]={{0,1},{1,0},{0,-1},{-1,0}};
int head,tail,ax,ay,bx,by,flag=0,n,nx,ny;
char ch;
scanf("%d",&n);
//由于输入是001,,100这样的,所以为了读1,0,0,而不是100,先转化成字符型再转化成整型,达到一个个读入
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(cin>>ch) jz[i][j]=ch-'0';
}
}
scanf("%d %d %d %d",&ax,&ay,&bx,&by);
//队列初始化
head=1;tail=1;
qwq[tail].h=ax;
qwq[tail].l=ay;
qwq[tail].s=0;
tail++;
vis[ax][ay]=1;
while(headn||ny<1||ny>n)
continue;
if(jz[nx][ny]==0&&vis[nx][ny]==0)
{
vis[nx][ny]=1;
qwq[tail].h=nx;//入队
qwq[tail].l=ny;
qwq[tail].s=qwq[head].s+1;
tail++;
}
if(nx==bx&&ny==by)//到达目的地
{
flag=1;break;
}
}
if(flag==1) break;
head++;//不管有没有新成员入队都要对已有的成员出队操作
}
//tail指向队尾(最后一个元素的下一个位置,所以-1)
cout<