【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


最后

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

相关文章
|
7月前
|
算法
讲课:拓扑排序、最短路算法
讲课:拓扑排序、最短路算法
|
7月前
|
算法 测试技术 算法框架/工具
【深度优先搜索】【图论】【推荐】332. 重新安排行程
【深度优先搜索】【图论】【推荐】332. 重新安排行程
|
7月前
|
存储
每日一题——地下迷宫(迷宫问题II)
每日一题——地下迷宫(迷宫问题II)
|
算法
食物链问题(并查集)
食物链问题(并查集)
96 0
|
机器学习/深度学习
大臣的旅费-动规/深搜
大臣的旅费-动规/深搜
83 0
|
定位技术
宝岛探险(求岛屿大小,染色法) 宽搜 深搜
宝岛探险(求岛屿大小,染色法) 宽搜 深搜
宝岛探险(求岛屿大小,染色法) 宽搜 深搜
Codeforces987D(逆向思维多源BFS)
Codeforces987D(逆向思维多源BFS)
128 0
|
机器学习/深度学习
|
机器人
【LeetCode剑指offer13】机器人的运动范围(BFS)
(1)求数位之和就while循环,每次循环求余; (2)bfs或者dfs都可以,如果用bfs则用到队列,遍历时为了防止重复遍历和遇到不合法的格子,在push入队列之前进行判断。
134 0
【LeetCode剑指offer13】机器人的运动范围(BFS)
|
存储 定位技术 C++
【PTA】龙舌兰酒吧 (BFS求双源最短路)
【PTA】龙舌兰酒吧 (BFS求双源最短路)
171 0
【PTA】龙舌兰酒吧 (BFS求双源最短路)

热门文章

最新文章