营救(广搜)

问题描述

铁塔尼号遇险了!他发出了求救信号。距离最近的哥伦比亚号收到了讯息,时间就是生命,必须尽快赶到那里。
通过侦测,哥伦比亚号获取了一张海洋图。这张图将海洋部分分化成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;
int m[1002][1002];
int a[1002],b[1002];
int head,tail;
int x1,y11,x2,y2;
int dist[1002][1002];
int dx[4]={-1,0,1,0};
int dy[4]={0,1,0,-1};
int n;
void bfs()
{
 head=0;
 tail=1;
 a[1]=x1,b[1]=y11;
 
 do
 {
  head++;
  int x=a[head];
  int y=b[head];
  if(x==x2&&y==y2) {
    printf("%d\n",dist[x][y]);
    break;
   }
  for(int i=1;i<=4;i++){
   int xx=x+dx[i];
   int yy=y+dy[i];
   if(xx==x2&&yy==y2) {
    printf("%d\n",dist[x][y]+1);
    return;
   }
   if(xx>=1&&xx<=n&&yy>=1&&yy<=n&&!m[xx][yy]&&dist[xx][yy]==0)
   {
    tail++;
    a[tail]=xx;
    b[tail]=yy;
    dist[xx][yy]=dist[x][y]+1;
    }
  }
  
  
 }while(head<tail);
 
}
int main()
{
 cin>>n;
 memset(dist,0,sizeof(dist));
 for(int i=1;i<=n;i++)
  for(int j=1;j<=n;j++)
   scanf("%1d",&m[i][j]);
   
 scanf("%d%d%d%d",&x1,&y11,&x2,&y2);
 if(x1==x2&&y11==y2) printf("%d\n",0);
 else
    bfs();
 return 0;
  
}
 /*
3
001
101
100
1 1 3 3
*/

你可能感兴趣的:(广搜)