• 营救


    【问题描述】
    铁塔尼号遇险了!他发出了求救信号。距离最近的哥伦比亚号收到了讯息,时间就是生命,必须尽快赶到那里。通过侦测,哥伦比亚号获取了一张海洋图。这张图将海洋部分分化成n*n个比较小的单位,其中用1标明的是陆地,用0标明是海洋。船只能从一个格子,移到相邻的四个格子。为了尽快赶到出事地点,哥伦比亚号最少需要走多远的距离?
    【输入格式】
    第一行为n,下面是一个n*n的0、1矩阵,表示海洋地图
    最后一行为四个小于n的整数,分别表示哥伦比亚号和铁塔尼号的位置。
    【输出格式】
    哥伦比亚号到铁塔尼号的最短距离,答案精确到整数。
    【输入样例】save.in
    3
    001
    101
    100
    1 1 3 3
    【输出样例】save.out
    4
    【数据范围】
    N<=1000

    算法分析:中规中矩的广搜即可解决问题。

    这里把出发点到达a[i][j]需要走的步数记录在a[i][j]。

     1 #include<stdio.h>
     2 #include<iostream>
     3 #include<queue>
     4 using namespace std;
     5 
     6 #define maxN 1002
     7 
     8 int a[maxN][maxN]={0};
     9 int desx,desy,soux,souy;
    10 queue<int> qx,qy;
    11 int dx[4]={0,1,0,-1},//右,下,左,上
    12     dy[4]={1,0,-1,0};
    13 int main()
    14 {
    15     int n,i,j;
    16     char strTemp[maxN];
    17     int xx,yy;
    18     int f=0;//0表示尚未找到目的地,1表示已经搜索到达目的地
    19     freopen("save.in","r",stdin);
    20     freopen("save.ans","w",stdout);
    21 
    22     scanf("%d",&n);getchar();
    23     //printf("%d
    ",n);
    24     for(i=0;i<n;i++)
    25     {
    26         gets(strTemp);
    27         //puts(strTemp);
    28         for(j=0;strTemp[j]!='';j++)
    29             {a[i][j]=strTemp[j]-'0';}
    30     }
    31     scanf("%d%d%d%d",&soux,&souy,&desx,&desy);
    32     //printf("%d %d %d %d
    ",soux,souy,desx,desy);
    33     soux--; souy--;
    34     desx--; desy--;
    35 
    36     a[soux][souy]=1;
    37     qx.push(soux); qy.push(souy);
    38     //printf("%d,%d
    ",soux,souy);
    39     while(!qx.empty())
    40     {
    41         for(i=0;i<4;i++)
    42         {
    43             xx=qx.front()+dx[i]; yy=qy.front()+dy[i];
    44             if(xx>=0&&yy>=0&&xx<n&&yy<n&&a[xx][yy]==0)
    45             {
    46                 a[xx][yy]=a[qx.front()][qy.front()]+1;
    47                 qx.push(xx); qy.push(yy);
    48                 //printf("%d,%d
    ",xx,yy);
    49             }
    50             if(xx==desx&&yy==desy)
    51             {
    52                 f=1;
    53                 break;
    54             }
    55         }
    56         qx.pop();
    57         qy.pop();
    58         if(f) break;
    59     }
    60     printf("%d
    ",a[desx][desy]-1);
    61     /**/
    62     return 0;
    63 }
  • 相关阅读:
    关于Snoop的用法
    WPF中Xaml编译正常而Designer Time时出错的解决办法
    TFS自定义开发中的反射应用
    用Fiddler2来监听HTTP(记:用skydrive sdk访问时,出错后用Fidder抓包分析)
    Send Code to evernote by my specify notebook
    Sublime Text2中Evernote 插件的使用
    编译Python出现Tab,空格的问题
    Python 中list, dictionary 与 file相互操作
    import module, from module import funtion区别
    C# 性能总结
  • 原文地址:https://www.cnblogs.com/huashanqingzhu/p/7230212.html
Copyright © 2020-2023  润新知