营救

简介: 【问题描述】 铁塔尼号遇险了!他发出了求救信号。距离最近的哥伦比亚号收到了讯息,时间就是生命,必须尽快赶到那里。通过侦测,哥伦比亚号获取了一张海洋图。这张图将海洋部分分化成n*n个比较小的单位,其中用1标明的是陆地,用0标明是海洋。

【问题描述】
铁塔尼号遇险了!他发出了求救信号。距离最近的哥伦比亚号收到了讯息,时间就是生命,必须尽快赶到那里。通过侦测,哥伦比亚号获取了一张海洋图。这张图将海洋部分分化成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",n);
24     for(i=0;i<n;i++)
25     {
26         gets(strTemp);
27         //puts(strTemp);
28         for(j=0;strTemp[j]!='\0';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\n",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\n",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\n",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\n",a[desx][desy]-1);
61     /**/
62     return 0;
63 }

 

相关文章
|
机器学习/深度学习
数据结构实验之查找四:二分查找
数据结构实验之查找四:二分查找
|
机器学习/深度学习 分布式计算 算法
大数据Spark机器学习
大数据Spark机器学习
181 1
大数据Spark机器学习
|
7月前
|
存储 人工智能 Kubernetes
ACK Gateway with AI Extension:面向Kubernetes大模型推理的智能路由实践
本文介绍了如何利用阿里云容器服务ACK推出的ACK Gateway with AI Extension组件,在Kubernetes环境中为大语言模型(LLM)推理服务提供智能路由和负载均衡能力。文章以部署和优化QwQ-32B模型为例,详细展示了从环境准备到性能测试的完整实践过程。
|
7月前
随机二次元背景毛玻璃个人导航HTML源码
随机二次元背景毛玻璃个人导航HTML源码
545 18
|
Java Linux
Flume【环境搭建 01】CentOS Linux release 7.5 安装配置 apache-flume-1.9.0 并验证
【2月更文挑战第16天】Flume【环境搭建 01】CentOS Linux release 7.5 安装配置 apache-flume-1.9.0 并验证
241 0
|
Web App开发 XML 数据可视化
MathML详解
MathML(数学标记语言)是一种基于XML的语言,用于在Web页面中结构化地展示数学公式和符号。它通过内容模型和表现模型描述数学表达式的语义和排版,广泛应用于教育、科学出版等领域,并支持屏幕阅读器提升可访问性。尽管现代浏览器如Firefox对其支持良好,但在某些浏览器中可能需额外插件才能正确渲染。MathML的优点包括结构化表示和高可读性,但也存在一定的学习曲线和兼容性问题。
|
Python
Python 循环语句的高级应用与深度探索
本文深入探讨了Python中循环语句的高级应用,包括`for`循环遍历字典获取键值、同步遍历多个序列,以及`while`循环结合条件判断和异常处理。通过嵌套循环实现了矩阵乘法,并介绍了如何优化循环以提升程序性能。示例代码展示了这些技术的实际应用。
124 15
|
Web App开发 iOS开发 开发者
电脑浏览器原来这样用才能发挥到极致 ——那些好用的插件(Windows Macos 通用)1
电脑浏览器原来这样用才能发挥到极致 ——那些好用的插件(Windows Macos 通用)
166 0
|
开发框架 .NET API
一个简单的 ASP.NET Core 依赖注入例子,提高代码的可维护性和可扩展性
一个简单的 ASP.NET Core 依赖注入例子,提高代码的可维护性和可扩展性
161 0
计算机如何快速打开计算器
计算机如何快速打开计算器
计算机如何快速打开计算器