【洛谷刷题】蓝桥杯专题突破-广度优先搜索-bfs(15)

简介: 【洛谷刷题】蓝桥杯专题突破-广度优先搜索-bfs(15)

写在前面:

怎么样才能学好一个算法?


我个人认为,系统性的刷题尤为重要,


所以,为了学好广度优先搜索,为了用好搜索应对蓝桥杯,


事不宜迟,我们即刻开始刷题!


题目:P1162 填涂颜色 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

题目描述:


输入格式:

每组测试数据第一行一个整数 n (1 ≤ n ≤ 30)。


接下来 n 行,由 0 和 1 组成的 n × n 的方阵。


方阵内只有一个闭合圈,圈内至少有一个 0。


输出格式:

已经填好数字 22 的完整方阵。


输入样例:

6
0 0 0 0 0 0
0 0 1 1 1 1
0 1 1 0 0 1
1 1 0 0 0 1
1 0 0 0 0 1
1 1 1 1 1 1

输出样例:

0 0 0 0 0 0
0 0 1 1 1 1
0 1 1 2 2 1
1 1 2 2 2 1
1 2 2 2 2 1
1 1 1 1 1 1

解题思路:

这道题就是让我们将被1围起来的位置全部涂上色,


大致的思路就是:


1. 先将在外面的0用状态数组存为true

     


2. 而剩下位置的0,也就是需要涂色的0就都是false,


3. 完成区分后,我们就直接将需要涂色的0全部置为2即可,


另外需要注意一些特殊情况,


如果我们开始搜索的位置是1,


那就会出问题,


我们可以将这个地图外围加一圈0:



这样搜索的时候就能保证,


将所有外围的0的位置全部改变状态,


下面是代码实现:


代码:

//包好头文件
#include 
#include 
#include 
#include 
using namespace std;
const int N = 35;
int n;
typedef pair PII;
bool st[N][N];
int g[N][N];
PII q[N * N];
//存偏移量
int dx[] = {-1, 0, 1, 0};
int dy[] = {0, 1, 0, -1};
int head = 0;
int tail = -1;
void bfs(int x, int y)
{
    q[++tail] = {x, y};
    st[x][y] = true;
    while(head <= tail)
    {
        auto t = q[head++];
        for(int i = 0; i < 4; i++)
        {
            int a = t.first + dx[i];
            int b = t.second + dy[i];
            if(a < 0 || a > n + 1 || b < 0 || b > n + 1) continue;
            if(g[a][b] == 1) continue;
            if(st[a][b] == true) continue;
            //将在外面的位置置为true
            st[a][b] = true;
            q[++tail] = {a, b};
        }
    }
}
int main()
{
    scanf("%d", &n);
    //读入地图
    for(int i = 1; i <= n; i++)
    {
        for(int j = 1; j <= n; j++)
        {
            scanf("%d", &g[i][j]);
        }
    }
    bfs(1, 1);
    //将1包围的位置置为2
    for(int i = 1; i <= n; i++)
    {
        for(int j = 1; j <= n; j++)
        {
            if(g[i][j] == 0 && !st[i][j])
            {
                g[i][j] = 2;
            }
        }
    }
    //打印
    for(int i = 1; i <= n; i++)
    {
        for(int j = 1; j <= n; j++)
        {
            printf("%d ", g[i][j]);
        }
        puts("");
    }
    return 0;
}


AC !!!!!!!!!!


写在最后:

以上就是本篇文章的内容了,感谢你的阅读。


如果喜欢本文的话,欢迎点赞和评论,写下你的见解。


如果想和我一起学习编程,不妨点个关注,我们一起学习,一同成长。



相关文章
|
5月前
|
存储 机器学习/深度学习 算法
第十五届蓝桥杯pb组国赛E题[马与象] (15分)BFS算法 详解
第十五届蓝桥杯pb组国赛E题[马与象] (15分)BFS算法 详解
57 3
|
5月前
|
算法 Python
蓝桥杯-搜索BFS+DFS
蓝桥杯-搜索BFS+DFS
40 2
|
5月前
|
Java
2022蓝桥杯大赛软件类省赛Java大学B组真题 刷题统计
2022蓝桥杯大赛软件类省赛Java大学B组真题 刷题统计
51 0
|
6月前
|
算法 安全 定位技术
【刷题】备战蓝桥杯 — dfs 算法
dfs算法在数据较小的情况下可以使用。 一定一定要确定好终止条件,避免栈溢出。 相应做好回溯,保证每次的遍历都是不一样的选择,避免少结果。 针对题目进行对应细节处理,有能力的话可以进行剪枝优化!!!
65 0
|
6月前
蓝桥杯备战刷题-滑动窗口
蓝桥杯备战刷题-滑动窗口
44 0
|
安全 算法
【洛谷刷题】蓝桥杯专题突破-广度优先搜索-bfs(16)
【洛谷刷题】蓝桥杯专题突破-广度优先搜索-bfs(16)
111 0
|
6月前
|
C++
第十三届蓝桥杯B组C++(试题C:刷题统计)
第十三届蓝桥杯B组C++(试题C:刷题统计)
50 0
|
程序员 定位技术 C++
[蓝桥杯] 双指针、BFS和DFS与图论问题
本篇文章针对蓝桥杯比赛的考点,列出双指针、BFS和DFS与图论的相关习题以及知识点的解释。希望本篇文章会对你有所帮助。
86 0
|
存储 算法 定位技术
蓝桥杯丨广度优先搜索
蓝桥杯丨广度优先搜索
74 0
《蓝桥杯每日一题》bfs·AcWing1562. 微博转发
《蓝桥杯每日一题》bfs·AcWing1562. 微博转发
50 0