洛谷 P1162 填充颜色 (BFS)

这道题的核心就是找到一个被“1”围起来的“0”,找到以后这道题就是个水题。

我的方法十分无脑,如果这个“0”被“1”围起来了,那么它的四周无论多远(<n)一定有“1”。所以这道题就可以开心的枚举了(),最差时间复杂度O(n^3),实际要比这跑得快.

#include<iostream>
#include<cstdio>
using namespace std;
int map[31][31];
bool flag[5],vis[31][31]; //flag用来储存0的四周是否都有1
                          //vis用于广搜,判断这个点是否更改过
int q[1001][2],h=1,t;     //队列
int fx[5][2]={{0,0},{1,0},{-1,0},{0,1},{0,-1}};//枚举方向
int main()
{
    //输入
    int n;
    cin>>n;
    for(int i=1;i<=n;i++)
      for(int j=1;j<=n;j++)
        cin>>map[i][j];
    //枚举每个点,判断它的四周是否都有1
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=n;j++)
        {

          if(!map[i][j])  //如果这个点不是1,那么枚举四周,算是个剪枝
            for(int k=1;k<=n;k++)
            {
                if(i+k<=n&&map[i+k][j]==1)
                  flag[1]=1;
                if(j+k<=n&&map[i][j+k]==1)
                  flag[2]=1;
                if(i-k>=1&&map[i-k][j]==1)
                  flag[3]=1;
                if(j-k>=1&&map[i][j-k]==1)
                  flag[4]=1;
            }
            if(flag[1]&&flag[2]&&flag[3]&&flag[4]) //如果四周都有1,那么标记,退出循环
            {
                q[++t][0]=i, q[t][1]=j;
                break;
            }
            for(int k=1;k<=4;k++) //如果不是,清空flag
              flag[k]=0;
        }
        if(q[t][0])
          break;
    }
    map[q[t][0]][q[t][1]]=2; //把第一个被找到的点变成2
    while(h<=t) //广搜
    {
        for(int i=1;i<=4;i++) //枚举四个方向
        {
            int x=q[h][0]+fx[i][0];
            int y=q[h][1]+fx[i][1];
            if(x<=n&&x>=1&&y<=n&&y>=1&&map[x][y]!=1&&!vis[x][y]) //如果没有越界,且不是1,且没有被访问过
            {
                map[x][y]=2;//把它变成2
                q[++t][0]=x;//入队
                q[t][1]=y;
                vis[x][y]=1;//标记这个点被访问过
            }
        }
        ++h; //取出队首
    }
    //输出
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=n;j++)
          cout<<map[i][j]<<" ";
        cout<<endl;
    }  

    return 0;
}

原文地址:https://www.cnblogs.com/wxl-Ezio/p/8505080.html

时间: 2024-10-10 00:48:25

洛谷 P1162 填充颜色 (BFS)的相关文章

洛谷P1162 填涂颜色 解题报告

by MedalPluS 题目描述: 由数字0 组成的方阵中,有一任意形状闭合圈,闭合圈由数字1构成,围圈时只走上下左右4个方向.现要求把闭合圈内的所有空间都填写成2.例如:6X6的方阵(n=6),涂色前和   涂色后的方阵如下:0 0 0 0 0 0      0 0 0 0 0 00 0 1 1 1 1      0 0 1 1 1 10 1 1 0 0 1      0 1 1 2 2 11 1 0 0 0 1      1 1 2 2 2 1 1 0 0 0 0 1      1 2 2

洛谷P1162(自我感觉思路还算巧妙的一道题)

P1162 填涂颜色 题目描述 由数字0 组成的方阵中,有一任意形状闭合圈,闭合圈由数字1构成,围圈时只走上下左右4个方向.现要求把闭合圈内的所有空间都填写成2.例如:6X6的方阵(n=6),涂色前和涂色后的方阵如下: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 1 1 1 1 0 1 1 0 0 1 0 1 1 2 2 1 1 1 0 0 0 1 1 1 2 2 2 1 1 0 0 0 0 1 1 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1

洛谷 P3956 棋盘 (BFS)

题目链接:https://www.luogu.org/problemnew/show/P3956 题目: 题目描述 有一个m × m的棋盘,棋盘上每一个格子可能是红色.黄色或没有任何颜色的.你现在要从棋盘的最左上角走到棋盘的最右下角. 任何一个时刻,你所站在的位置必须是有颜色的(不能是无色的), 你只能向上. 下.左. 右四个方向前进.当你从一个格子走向另一个格子时,如果两个格子的颜色相同,那你不需要花费金币:如果不同,则你需要花费 1 个金币. 另外, 你可以花费 2 个金币施展魔法让下一个无

[洛谷1649]障碍路线&lt;BFS&gt;

题目链接:https://www.luogu.org/problem/show?pid=1649 历经千辛万苦,我总算是把这个水题AC了,现在心里总觉得一万只草泥马在奔腾: 这是一道很明显的BFS,然后我也明显的看出来了 但是,我就是WA了很久很久,在调试第一个晚上后,我发现读入是存在空格的,而不是数据问题 然后第二个问题就是,BFS找到的第一个终点不一定就是最优的答案(当然第二个问题是我重新打了一次猛然发现之前没注意的一点) 注意到这两点,其实这道题就没难度了 然后这道题的处理需要注意一个地方

[bzoj2120] [洛谷P1903] 数颜色

Description 墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会像你发布如下指令: 1. Q L R代表询问你从第L支画笔到第R支画笔中共有几种不同颜色的画笔. 2. R P Col 把第P支画笔替换为颜色Col.为了满足墨墨的要求,你知道你需要干什么了吗? Input 第1行两个整数N,M,分别代表初始画笔的数量以及墨墨会做的事情的个数.第2行N个整数,分别代表初始画笔排中第i支画笔的颜色.第3行到第2+M行,每行分别代表墨墨会做的一件事情,格

洛谷 1144 最短路计数 bfs

洛谷1144 最短路计数 传送门 其实这道题目的正解应该是spfa里面加一些处理,,然而,,然而,,既然它是无权图,,那么就直接bfs了,用一个cnt记录一下每一个点的方案数,分几种情况讨论一下转移,最后输出cnt即为结果.. 题目中所说的重边和自环啥的没看出来有啥影响.. 1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 5 const int maxn = 100000 + 500;

洛谷 P1379 八数码难题 Label:判重&amp;&amp;bfs

特别声明:紫书上抄来的代码,详见P198 题目描述 在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字.棋盘中留有一个空格,空格用0来表示.空格周围的棋子可以移到空格中.要求解的问题是:给出一种初始布局(初始状态)和目标布局(为了使题目简单,设目标状态为123804765),找到一种最少步骤的移动方法,实现从初始布局到目标布局的转变. 输入输出格式 输入格式: 输入初试状态,一行九个数字,空格用0表示 输出格式: 只有一行,该行只有一个数字,表示从初始状态到目标状态需要的最少移动次数

洛谷 P1126 机器人搬重物 (BFS)

题目链接:https://www.luogu.org/problemnew/show/P1126 吐槽:这题很阴险 一开始没把格子图转化成点图:30分 转化成点图,发现样例过不去,原来每步要判断vis数组和step大小,寻找最优解,一块加了上去,以为能AX,结果边界处理不对:50分 加了边界后才AC. (实际修改过程要坑爹的多orz 这么说吧,从20分到100分我全得过) 言归正传,搞一下这道题 广搜题,思路很好想:用结构体开个队列,分别保存每步的坐标.方向和步数,用vis数组保存当前格子上的最

洛谷 P2709 BZOJ 3781 小B的询问

题目描述 小B有一个序列,包含N个1~K之间的整数.他一共有M个询问,每个询问给定一个区间[L..R],求Sigma(c(i)^2)的值,其中i的值从1到K,其中c(i)表示数字i在[L..R]中的重复次数.小B请你帮助他回答询问. 输入输出格式 输入格式: 第一行,三个整数N.M.K. 第二行,N个整数,表示小B的序列. 接下来的M行,每行两个整数L.R. 输出格式: M行,每行一个整数,其中第i行的整数表示第i个询问的答案. 输入输出样例 输入样例#1: 6 4 3 1 3 2 1 1 3