营救 BFS入门

题目描述

        铁塔尼号遇险了!他发出了求救信号。距离最近的哥伦比亚号收到了讯息,时间就是生命,必须尽快赶到那里。

        通过侦测,哥伦比亚号获取了一张海洋图。这张图将海洋部分分化成n*n个比较小的单位,其中用1标明的是陆地,用0标明是海洋。船只能从一个格子,移到相邻的四个格子。

       为了尽快赶到出事地点,哥伦比亚号最少需要走多远的距离。

输入

第一行为n,下面是一个n*n的0、1矩阵,表示海洋地图

最后一行为四个小于n的整数,分别表示哥伦比亚号和铁塔尼号的位置。

输出

输出哥伦比亚号到铁塔尼号的最短距离,答案精确到整数。

样例输入

3
001
101
100
1 1 3 3

样例输出

4

提示


N<=1000

解题思路:此题较为简单,重点在于将解答树中的每层子节点的层数标记出来,这样最先找到结果的层数就为最少补数。

#include<bits/stdc++.h>
using namespace std;
int n,m,b[1000][1000]={0},num=0,g,g1,t1,t;
int dx[]={-1,0,1,0};//方向 
int dy[]={0,1,0,-1};
struct point 
{
  int x;
  int y;
  int c;
  point (int xx,int yy)
  {
  	x=xx;
  	y=yy;
  	
	  }	
};
int bfs(point start)
 {

 	queue<point>q;
 	q.push(start);
 	b[start.x][start.y]=2;
 	while(!q.empty())
 	{    point p=q.front();
 	 if(p.x==t&&p.y==t1)
	  { num=p.c;
	  	break;
	  }

 	  q.pop();
 	   
 		  for(int i=0;i<4;i++)
 		   {
 		   	 point tp(p.x+dx[i],p.y+dy[i]);
 		   	 if(tp.x>=0&&tp.x<m&&tp.y>=0&&tp.y<n&&!b[tp.x][tp.y])
 		   	  { tp.c=p.c+1;//关键的层数 
 		   	  	 q.push(tp);
 		   	  	  b[tp.x][tp.y]=2;
 		   	  	  
 		   	  	 
 		   	  	 
				  }
			}
	 }
 }
int main()
{  

scanf("%d",&n);
m=n;
 for(int i=0;i<n;i++)
  {
  	  for(int j=0;j<n;j++)
  	    {scanf("%1d",&b[i][j]);
  	   
		  }
  	   
	 }  
	  scanf("%d %d %d %d",&g,&g1,&t,&t1) ;
	  g--;
	  g1--;
	  t--;
	  t1--;

	 point start(g,g1);
	  start.c=0;
	  
	  bfs(start);

	 
 	cout<<num<<endl;
}

猜你喜欢

转载自blog.csdn.net/explodee/article/details/81429253