【C++广度搜索】营救

我想不会有什么帮助的索引

队列我有写过一篇题解来说明,见:【C++广度搜索入门】面积

这是我的第二篇广搜题解,可能仍有众多不足,请大家多指教,欢迎与我讨论

题目

问题 B: 营救

时间限制: 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<

 

你可能感兴趣的:(c++编程)