【12年特长生第三题】【BFS】营救

营 救 营救


题目

铁塔尼号遇险了!他发出了求救信号。距离最近的哥伦比亚号收到了讯息,时间就是生命,必须尽快赶到那里。
通过侦测,哥伦比亚号获取了一张海洋图。这张图将海洋部分化成n*n个比较小的单位,其中用1标明的是陆地,用0标明是海洋。当然,船只能在海洋上行驶,且船只能从一个格子,移到相邻的四个格子
为了尽快赶到出事地点,哥伦比亚号最少需要走多远的距离


输入

从文件save.in中读入数据,第一行为n,下面是一个n*n的0,1矩阵,表示海洋地图,最后一行为四个小于n的整数,分别表示哥伦比亚号和铁塔尼号的位置

输出

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


输入样例

save.in
3
001
101
100
1 1 3 3

输出样例

save.out
4

说明

数据范围说明: N < = 1000 N<=1000 N<=1000

解题思路

这题用BFS来做
只要搜索它的最短路即可

程序如下

#include
#include
#include
#include
#include
 
using namespace std;

const int dx[4] = {-1, 0, 1, 0};
const int dy[4] = {0, 1, 0, -1};
int x1,y1,x2,y2,n;

int a[1005][1005];

char c[1000];

struct e
{
    int s, x, y;
};

void bfs(int x,int y)
{
    e p,xx;
    p.x = x;
    p.y = y;
    p.s = 0;
    queue<e> q;
    while(!q.empty())
    {
        p = q.front();
    	q.pop();
        if(p.x == x2 && p.y == y2)//判断如果已经到了就输出
        {
            printf("%d\n",p.s);
            break;
        }
        for(int i = 0; i < 4; ++i)
        {
            xx.x = p.x + dx[i];
            xx.y = p.y + dy[i];//下一步的方位
            if(xx.x > 0 && xx.x <= n && xx.y > 0 && xx.y <= n && !a[xx.x][xx.y])//判断是否出界
            {
                a[xx.x][xx.y] = 1;
                xx.s = p.s+1;
                q.push(xx);
            }
        }
    }
}
int main()
{
 
    scanf("%d\n",&n);
    memset(a,0,sizeof(a));
    for(int i = 1; i <= n; ++i)
    {
        scanf("%s",&c);
        for(int j = 1; j <= n; ++j)
            a[i][j] = c[j - 1] - '0';//读入
    }
    scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
    a[x1][y1] = 1;//初始值
    bfs(x1,y1);
    return 0;
}

你可能感兴趣的:(BFS,ssl)