【BFS】海上救援任务

简介: 【BFS】海上救援任务(c++基础算法)

本专栏上一篇:【BFS】魔板(c++基础算法)_静渊隐者的博客-CSDN博客


目录

一.读题

①题面

②题意

三.做题

四.AC代码

最后


一.读题

①题面

【宽搜(难度:4)】海上救援任务

【题意】

广阔的大海地图可以由矩形阵列表示。

矩阵的元素由数字0和1组成。0表示海水。数字1代表军舰。

同一舰队的定义为沿军舰数字上下左右还是军舰数字1则为同一舰队。

求给定矩形阵列的舰队个数。如:矩阵

0111100011

1011110100

1011100111

0000000011

有4个舰队。

其中有艘军舰发生故障,负责救援的人员从固定的救援军舰赶往故障处。处于安全考虑,救援人员只能通过舰队内部到达故障点。

【输入格式】

第一行两个整数n,m (1 < = n,m< = 100)

下来是n×m矩阵

下来一行K(1 < = K < =2000) ,代表下来K行有K个询问。每行为X1,Y1,X2,Y2代表两艘军舰的海上坐标。

【输出格式】

如果两艘军舰属于同一舰队那么输出它们之间最短的内部距离,若两艘军舰不属于同一舰队,那么请输出"Impossible".

注意: 舰队由军舰构成。^_^

【样例输入】

4 10

0111100011

1011110100

1011100111

0000000011

2

1 3 2 6

1 3 4 10

【样例输出】

4

Impossible

②题意

若存在xs,ys在不经过零的情况下到达xe,ye的路线,则输出最短路径;否则,输出Impossible


三.做题

可以说,这道题是百年不遇的水题,因此就不解释了。

唯一值得注意的是,存入地图的操作。

因为输入的地图不含空格,因此必须以字符形式输入。输入后,可依托ASCII码进行运算,将其转换为int类型的数组。

for(int i=1;i<=n;i++)
  {
    for(int j=1;j<=m;j++)
    {
      char ch;
      cin>>ch;
      a[i][j]=ch-'0';
    } 
  }

image.gif


四.AC代码

不写注释啦!

#include<bits/stdc++.h>
using namespace std;
struct node{
  int x,y,ans;
};
queue<node>q;
int dx[4] = {-1, 1, 0, 0};
int dy[4] = {0, 0, -1, 1};
int a[105][105];
int n,m,t,bo[105][105];
int main()
{
  scanf("%d%d",&n,&m);
  for(int i=1;i<=n;i++)
  {
    for(int j=1;j<=m;j++)
    {
      char ch;
      cin>>ch;
      a[i][j]=ch-'0';
    } 
  }
  scanf("%d",&t);
  while(t--)
  {
    memset(bo,0,sizeof(bo));
    node xs,xe;
    bool flag=false;
    xs.ans=0;
    scanf("%d%d%d%d",&xs.x,&xs.y,&xe.x,&xe.y);
    q.push(xs);
    while(!q.empty())
    {
      for(int i=0;i<4;i++)
      {
        node ne;
        ne.x=q.front().x+dx[i],ne.y=q.front().y+dy[i];
        if(bo[ne.x][ne.y]==0&&ne.x>=0&&ne.y>=0&&ne.x<=n&&ne.y<=m&&a[ne.x][ne.y]==1)
        {
          ne.ans=q.front().ans+1;
          bo[ne.x][ne.y]=1;
          q.push(ne);
          if(ne.x==xe.x&&ne.y==xe.y)
          {
            flag=true;
            printf("%d\n",q.back().ans);
            break;
          }
        }
      }
      if(flag) break;
      q.pop(); 
    }
    if(!flag) printf("Impossible\n");
  }
}

image.gif


最后

没什么要说的,不过说一句话:普及组训练营暂时停更 暂时停更。

相关文章
|
6天前
|
存储
每日一题——地下迷宫(迷宫问题II)
每日一题——地下迷宫(迷宫问题II)
|
6月前
|
算法 C++
单源最短路的建图
单源最短路的建图
30 0
蓝桥 全球变暖 (bfs)
蓝桥 全球变暖 (bfs)
|
11月前
|
机器学习/深度学习
大臣的旅费-动规/深搜
大臣的旅费-动规/深搜
56 0
|
11月前
|
数据安全/隐私保护
BFS:密码锁
BFS:密码锁
LeetCode每日一题(11)——太平洋大西洋水流问题(递归,深度优先遍历实例)
大西洋太平洋水流问题 1.题目 2.示例 3.思路 理解题目 解题思路 4.代码
112 0
LeetCode每日一题(11)——太平洋大西洋水流问题(递归,深度优先遍历实例)
|
机器人
UPC—— 最勇敢的机器人(并查集+分组背包)
UPC—— 最勇敢的机器人(并查集+分组背包)
60 0
2015长春网络赛 —— B. Ponds (拓扑排序删点+DFS)
2015长春网络赛 —— B. Ponds (拓扑排序删点+DFS)
67 0
|
定位技术
宝岛探险(求岛屿大小,染色法) 宽搜 深搜
宝岛探险(求岛屿大小,染色法) 宽搜 深搜
宝岛探险(求岛屿大小,染色法) 宽搜 深搜
|
存储
[Luogu] 炸铁路 | Tarjan 割边
题目描述 A 国派出将军uim,对 B 国进行战略性措施,以解救涂炭的生灵。 B 国有 n个城市,这些城市以铁路相连。任意两个城市都可以通过铁路直接或者间接到达。 uim 发现有些铁路被毁坏之后,某两个城市无法互相通过铁路到达。这样的铁路就被称为 key road。 uim 为了尽快使该国的物流系统瘫痪,希望炸毁铁路,以达到存在某两个城市无法互相通过铁路到达的效果。 然而,只有一发炮弹(A 国国会不给钱了)。所以,他能轰炸哪一条铁路呢?
109 0