首页 > 编程语言 >C++U5-第05课-广度优先搜索2

C++U5-第05课-广度优先搜索2

时间:2024-02-25 19:33:42浏览次数:29  
标签:MAP 队列 颜色 05 U5 C++ int 搜索 广度

学习目标

 广度优先搜索的思路复习

 

[【广度优先搜索(二)】图像渲染]

 

 

【题意分析】
从需要上色的点开始,将所有与他相连接的点全部涂上相同的颜色

【思路分析】
我们从给定的起点开始,进行广度优先搜索。每次搜索到一个方格时,如果其与初始位置的方格颜色相同,就将该方格加入队列,并将该方格的颜色更新,以防止重复入队。因为初始位置的颜色会被修改,所以我们还需要保存初始位置的颜色,以便于之后的更新操作。

1.定义方向数组,地图数组用于储存

2.输入地图,输入起始点和需要改变的颜色z

3.如果起始点的颜色与当前需要修改的颜色相同直接输出图像

4.定义队列并且将起始点压入队列

5.创建变量将初始点的颜色保存下来,并修改初始点颜色

6.while循环判断队列是否为空

7.取出队头

8.朝四个方向搜索

9.下一步的位置并未超出地图边界并且当前颜色和起始点的颜色相同

10.将下一步位置压入队列并且将位置颜色改变为z

11.最后输出改变完毕的图像

【参考代码】
#include <bits/stdc++.h>
using namespace std;
// 定义方向数组
int dx[4] = {1, 0, 0, -1};
int dy[4] = {0, 1, -1, 0};
// 定义地图数组用于储存
int MAP[102][102];
struct node {
    int x, y;
};
int main() {
    int n, m;
    cin >> n >> m;
    // 输入地图
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= m; j++) {
            cin >> MAP[i][j];
        }
    }
    // 输入起始点和需要改变的颜色z
    int x, y, z;
    cin >> x >> y >> z;
    // 如果起始点的颜色与当前需要修改的颜色相同直接输出图像
    if (z == MAP[x][y]) {
        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= m; j++) {
                cout << MAP[i][j] << " ";
            }
            cout << endl;
        }
        return 0;
    }
    // 定义队列并且将起始点压入队列
    queue<node> q;
    q.push({x, y});
    // 创建变量将初始点的颜色保存下来,并修改初始点颜色
    int Color = MAP[x][y];
    MAP[x][y] = z;
    // while循环判断队列是否为空
    while (!q.empty()) {
        // 取出队头
        node now = q.front();
        q.pop();
        // 朝四个方向搜索
        for (int i = 0; i < 4; i++) {
            int fx = now.x + dx[i];
            int fy = now.y + dy[i];
            // 下一步的位置并未超出地图边界并且当前颜色和起始点的颜色相同
            if (fx > 0 && fy > 0 && fx <= n && fy <= m && MAP[fx][fy] == Color) {
                // 将下一步位置压入队列并且将位置颜色改变为z
                MAP[fx][fy] = z;
                q.push({fx, fy});
            }
        }
    }
    // 最后输出改变完毕的图像
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= m; j++) {
            cout << MAP[i][j] << " ";
        }
        cout << endl;
    }
    return 0;
}
View Code

 

 

[【广度优先搜索(二)】岛屿数量]

 

 

 

【题意分析】
要求在一个二维网格中找出所有的岛屿数量

【思路分析】
扫描整个二维网格。如果一个位置为 1,则将其加入队列,并且数量+1,开始进行广度优先搜索。在广度优先搜索的过程中,每个搜索到的 1 都会被重新标记为 0。直到队列为空,搜索结束。最后输出统计的数量

【参考代码】
#include <bits/stdc++.h>
using namespace std;
// 定义方向数组
int dx[4] = {1, 0, 0, -1};
int dy[4] = {0, 1, -1, 0};
// 定义地图数组用于储存
int MAP[102][102], n, m;
struct node {
    int x, y;
};
void bfs(int x, int y) {
    // 定义队列并且将起始点压入队列
    queue<node> q;
    q.push({x, y});
    while (!q.empty()) {
        // 取出队头
        node now = q.front();
        q.pop();
        // 朝四个方向搜索
        for (int i = 0; i < 4; i++) {
            int fx = now.x + dx[i];
            int fy = now.y + dy[i];
            // 下一步的位置并未超出地图边界并且当前位置为1
            if (fx > 0 && fy > 0 && fx <= n && fy <= m && MAP[fx][fy] == 1) {
                // 将下一步位置压入队列并且将位置改变为0
                MAP[fx][fy] = 0;
                q.push({fx, fy});
            }
        }
    }
}
int main() {
    cin >> n >> m;
    // 输入地图
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= m; j++) {
            cin >> MAP[i][j];
        }
    }
    // 定义sum统计岛屿的数量
    int sum = 0;
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= m; j++) {
            // 当前为岛屿的1,统计数量+1,并且将当前位置改为0
            if (MAP[i][j] == 1) {
                sum++;
                MAP[i][j] = 0;
                bfs(i, j);
            }
        }
    }
    // 输出统计的岛屿的数量
    cout << sum << endl;
    return 0;
}
View Code

 

初赛知识

 

标签:MAP,队列,颜色,05,U5,C++,int,搜索,广度
From: https://www.cnblogs.com/jayxuan/p/18032769

相关文章

  • C++文件读取末尾空行问题
    起因是做gitlet读取文件内容时遇到的内容不匹配错误,后来发现是自己读取文件内容时均使用getline函数,写回时读入的每个字符串都加上换行符,导致文件末尾可能多出换行符。于是改成了vector<string>Blob::readContentsForBlob(conststring&file){vector<string>content;......
  • 05 锁
    数据库锁设计的初衷是处理并发问题。作为多用户共享的资源,当出现并发访问的时候,数据库需要合理地控制资源的访问规则。而锁就是用来实现这些访问规则的重要数据结构。全局锁对整个数据库实例加锁,之后其他线程的以下语句会被阻塞:数据更新语句(数据的增删改)、数据定义语句(包括建表......
  • 05 Hello World
    05HelloWorld随便新建一个文件夹,存放代码新建一个java文件txt(文件后缀名为).javaHello.java【注意点】系统可能没显示文件后缀名,我们需要手动打开使用Notpad++编写代码publicclassHello{ publicstaticvoidmain(String[]args){ System.out.print("......
  • Python数据结构与算法05——归并排序
    归并排序:defmerge_sort(aimlist):#归并排序拆分-排序-合并也就是merge_返回的是是一个已经排好序的列表n=len(aimlist)ifn<=1:returnaimlistmid=n//2aimlist_left=merge_sort(aimlist[:mid])aimlist_right=merge_sort(aimlist[mid:......
  • 3. 无重复字符的最长子串C++
    思路就是从头开始找,然后每次在从重复节点的后一个找。classSolution{public:intlengthOfLongestSubstring(strings){inti=0,j=0,nowmax=1;intmax=1;if(s.size()==0||s.size()==1)returns.size();map<char,int>m;......
  • oracle指定控制文件启动 ORA-00205: error in identifying control file, check aler
    SQL>startupORACLEinstancestarted.TotalSystemGlobalArea1068937216bytesFixedSize2220200bytesVariableSize708841304bytesDatabaseBuffers352321536bytesRedoBuffers5554176bytesORA-00205:......
  • Java基础05:类型转换
    类型转换1.由于Java是强类型语言,所以要进行有些运算的时候,需要用到类型转换低------------------------------------------------->高byte,short,char--->int--->long--->float--->double强制转换:由高类型转换到低类型  自动......
  • IIS PUT请求.netcore6.0接口 报HTTP Error 405 - Method Not Allowed
    在新的服务器上部署了一个.netcore的项目,部分请求地址使用了put、delete方式,导致无法正常请求,报Error405-MethodNotAllowed。由于配置IIS时把“WebDAV发布”给勾选了,所以会导致拦截。服务器和IIS10配置如下图:解决方案服务器上删除“WebDAV发布”1、打开“控制面......
  • C++ STL学习
    C++STL学习目录C++STL学习容器库概览对可以保存在容器中的元素的限制容器支持的操作所有容器都支持的操作或容器成员迭代器迭代器的公共操作迭代器的类型迭代器的const属性迭代器的操作类型迭代器范围使用左闭合区间的编程假定顺序容器顺序容器概述顺序容器的类型和特点确定使......
  • C++ 拷贝构造函数简单测试
    浅拷贝静态数组的空间体现深拷贝的效果#include<iostream>#include<string>usingnamespacestd;#defineSEX_SIZE10classStudent{public:Student(stringname){Age=10;Name=newstring(name);strcpy(Sex,"男");......