2021-04-13

P1162 填涂颜色(dfs) 题目:https://www.luogu.org/problem/P1162 Description: 由数字0组成的方阵中,有一任意形状闭合圈,闭合圈由数字1构成,围圈时只走上下左右4个方向。现要求把闭合圈内的所有空间都填写成2. Solution: 围圈内的部分不要动,把围圈和围圈外的部分进行标记,输出时,没有标记的部分,即圈内部分输出为2,其余按原图输出。 注意,在进行df... 阅读详情

题目描述

由数字0组成的方阵中,有一任意形状闭合圈,闭合圈由数字11构成,围圈时只走上下左右4个方向。现要求把闭合圈内的所有空间都填写成2,涂色前和涂色后的方阵如下:

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

输入格式

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

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

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

输出格式

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

输入输出样例

输入 #1

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

输出 #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

 

输入 #2

20
0 0 0 0 1 1 1 0 0 0 0 1 1 1 0 0 0 0 0 0
0 0 0 0 1 0 1 0 0 0 0 1 0 1 0 0 0 0 0 0
0 0 0 0 1 0 1 0 0 0 0 1 0 1 0 0 0 0 0 0
0 0 0 0 1 0 1 0 0 0 0 1 0 1 0 0 0 0 0 0
0 0 0 0 1 0 1 0 0 0 0 1 0 1 0 0 0 0 0 0
0 0 0 0 1 0 1 0 0 0 0 1 0 1 0 0 0 0 0 0
1 1 1 1 1 0 1 1 1 1 1 1 0 1 0 0 0 0 0 0
1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
1 1 1 1 1 1 1 1 1 0 0 0 0 1 1 1 1 1 1 1
0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1
0 0 0 0 0 0 0 0 1 0 1 1 1 1 0 0 0 1 1 1
0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 1 1 1 0 0
0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 1 0 0 0 0
0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 1 0 0 0 0
0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 1 1 1 1 1
0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 0 0 0 1
0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 1 1 1 1 1
0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 1 0 0 0 0
0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 1 0 0 0 0
0 0 0 0 0 0 0 0 1 1 1 0 0 1 1 1 0 0 0 0

输出 #2

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

 

说明/提示

1<=n<=30

分析:遍历矩阵,如果当前位置(x,y)数字为0,就DFS搜索,如果能到达边界即(x<0||x>n||y<0||y>n),就把当前位置(x,y)以及走过的所有位置{(x1,y1),(x2,y2)...}用vis数组标记为1,代表这些位置都能达到边界。

我刚开始是用了记忆化搜索记忆了能达到边界的点,然后遍历整个矩阵,结果超时了。。。,有第四个测试点没过,也就是上面那个n=20的样例。

#include<bits/stdc++.h>
using namespace std;
int n;
int vis[33][33];
int mp[33][33];
int book[33][33];
int dx[]= {-1,1,0,0};
int dy[]= {0,0,-1,1};
bool dfs(int x,int y)
{
    if(vis[x][y])
        return true;
    if(mp[x][y])
        return false;
    for(int i = 0; i<4; i++)
    {
        int ax = x+dx[i];
        int ay = y+dy[i];
        if(ax<0||ax>n||ay<0||ay>n)
        {
            vis[x][y]=1;
            return true;
        }
        if(book[ax][ay]==0)
        {
            book[ax][ay]=1;
            if(dfs(ax,ay))
            {
                vis[x][y]=1;
                book[ax][ay]=0;
                return true;
            }
            book[ax][ay]=0;
        }
    }
    return false;
}
int main()
{
    cin>>n;
    for(int i = 0; i<n; i++)
    {
        for(int j = 0; j<n; j++)
        {
            scanf("%d",&mp[i][j]);
        }
    }
    for(int i = 0; i<n; i++)
    {
        for(int j = 0; j<n; j++)
        {
            dfs(i,j);
        }
    }
    for(int i = 0; i<n; i++)
    {
        for(int j = 0; j<n; j++)
        {
            if(j==n-1)
            {
                if(vis[i][j]==0&&mp[i][j]==0)
                {
                    cout<<2<<endl;
                }
                else
                {
                    cout<<mp[i][j]<<endl;
                }
            }
            else
            {
                if(vis[i][j]==0&&mp[i][j]==0)
                {
                    cout<<2<<" ";
                }
                else
                {
                    cout<<mp[i][j]<<" ";
                }
            }
        }
    }
    return 0;
}

后来我想,把出不去的点也记忆化,结果是错误的!!因为出不去的点存在这样一种情况

这样一个矩阵,我的程序会从第一个0(坐标为1,3)

 由于我搜索的顺序是上下左右,所以从(1,3)开始搜索,向上不行,向下一直到最下面那个0(黄色的是走过的路)

之后在向左走

再向上走

最后会堵在这个红色的格的左边

因为我们的程序默认走过的路不能再走,所以程序会默认这个绿色的0走不出去就把他们标记为走不出去的位置了。

 

看了题解后,发现有一种更好的做法。具体做法:把矩阵整体移一下位置

这样从(0,0)开始搜索就能一下子把全部能到达边界的0标记了。

#include <bits/stdc++.h>
using namespace std;
int a[32][32],b[32][32];
int dx[5]={0,-1,1,0,0};
int dy[5]={0,0,0,-1,1};//第一个表示不动,是充数的,后面的四个分别是上下左右四个方向
int n,i,j;
void dfs(int p,int q){
    int i;
    if (p<0||p>n+1||q<0||q>n+1||a[p][q]!=0) return;//如果搜过头或者已经被搜过了或者本来就是墙的就往回
    a[p][q]=1;//染色
    for (i=1;i<=4;i++) dfs(p+dx[i],q+dy[i]);//向四个方向搜索
}
int main(){
    cin>>n;
    for (i=1;i<=n;i++)
        for (j=1;j<=n;j++){
            cin>>b[i][j];//其实不拿两个数组也可以,不过我喜欢啦
            if (b[i][j]==0) a[i][j]=0;
            else a[i][j]=2;
        }
    dfs(0,0);//搜索 从0,0开始搜
    for (i=1;i<=n;i++){
        for (j=1;j<=n;j++)
        if (a[i][j]==0) cout<<2<<' ';//如果染过色以后i,j那个地方还是0,说明没有搜到,就是周围有墙,当然就是被围住了,然后输出2
        else cout<<b[i][j]<<' ';//因为被染色了,本来没有被围住的水和墙都染成了1,所以就输出b[i][j]
        cout<<'\n';//换行
    }
}

 

Dify 深度进阶:从入门到精通AI应用构建 《Dify进阶指南:从基础到高阶的AI应用开发技巧》 本文深入探讨Dify平台的高级功能与应用开发技巧。首先强调核心概念的深化,包括提示词工程进阶、知识库高效管理和模型参数优化。重点介绍智能体应用的开发方法,如何让AI具备自主规划与执行能力。同时讲解工作流编排、前端集成等实用技术,并分享应用运营优化、成本控制等实践经验。文章还展望了Dify生态的发展趋势,为开发者提供从基础到进阶的完整学习路径,助力打造更智能高效的AI应用。 阅读详情

相关推荐

一文详解心电图(ECG)监测原理

介绍心电图的监测原理,从心电信号产生、获取到心电图的基本组成

m0_50146396的博客 3287

12.31

一个网格与其周围的八个网格相连,而一组相连的网格视为一个水坑。由数字 00 组成的方阵中,有一任意形状闭合圈,闭合圈由数字 11 构成,围圈时只走上下左右 44 个方向。由于近期的降雨,雨水汇集在农民约翰的田地不同的地方。一个如下的6×6 的跳棋棋盘,有六个棋子被放置在棋盘上,使得每行、每列有且只有一个,每条对角线(包括两条主对角线的所有平行线)上至多有一个棋子。对于 100\%100% 的数据,1 \le n \le 301≤。对于 100\%100% 的数据,6 \le n \le 136≤。

m0_74091166的博客 297

从SAR信号到洪涝地图:基于Sentinel-1数据的水体快速提取实战

本文详细介绍了如何利用Sentinel-1 SAR数据快速提取水体信息并生成洪涝地图的实战方法。通过预处理五部曲和SDWI指数计算,结合具体案例展示了SAR技术在洪涝灾害应急监测中的高效性和准确性,为救援决策提供关键支持。

weixin_29201313的博客 461

C语言填涂颜色(染色问题)

组成的方阵中,有一任意形状闭合圈,闭合圈由数字。现要求把闭合圈内的所有空间都填写成。方阵内只有一个闭合圈,圈内至少有一个。每组测试数据第一行一个整数。构成,围圈时只走上下左右。

lxh0113的博客 1967

GD32F470实战:如何用EXMC+SDRAM为LVGL打造超大内存池(附完整配置代码)

本文详细介绍了如何利用GD32F470的EXMC接口与SDRAM深度整合,为LVGL构建高性能内存解决方案。通过硬件架构设计、EXMC接口配置、高级内存管理策略及LVGL性能优化技巧,开发者可以突破微控制器内存限制,实现高分辨率显示和复杂动画效果。附完整配置代码,助力嵌入式GUI开发。

rrr55的博客 547

VS2015编译配置GDAL(图文并茂、超详细!!!)

文章目录一、GDAL介绍二、下载GDAL三、修改源代码四、工具命令提示符操作五、编译GDAL六、安装GDAL七、在VS2015的项目中配置GDAL八、添加环境变量九、测试是否配置成功 一、GDAL介绍 GDAL(Geospatial Data Abstraction Library)是一个在XMIT许可协议下的开源栅格空间数据转换库。它利用抽象数据模型来表达所支持的各种文件格式。它还有一系列命令行工具来进行数据转换和处理。OGR是GDAL项目的一个分支,功能与GDAL类似,只不过它提供对矢量数据的支持。因此

weixin_46196863的博客 3756

洛谷题解——P1162:填涂颜色

题目相关 题目链接 洛谷,https://www.luogu.com.cn/problem/P1162。 题目描述 由数字 0 组成的方阵中,有一任意形状闭合圈,闭合圈由数字 1 构成,围圈时只走上下左右 4 个方向。现要求把闭合圈内的所有空间都填写成 2。 输入格式 每组测试数据第一行一个整数 n。 接下来 n 行,由 0 和 1 组成的 n×n 的方阵。 方阵内只有一个闭合圈,...

努力中的老周的专栏 1747

Flutter蓝牙开发实战:flutter_blue_plus核心功能与实现原理剖析

本文深入剖析了Flutter蓝牙开发插件flutter_blue_plus的核心功能与实现原理。文章从源码解析入手,详细讲解了蓝牙状态管理、设备扫描、GATT连接、服务发现以及数据读写等关键流程的实现机制,并分享了实战中的性能调优与常见问题解决方案,帮助开发者高效构建跨平台蓝牙应用。

weixin_29014237的博客 443

洛谷P1162 填涂颜色(C++)(BFS)

填涂颜色## 题目描述由数字 $0$ 组成的方阵中,有一任意形状闭合圈,闭合圈由数字 $1$ 构成,围圈时只走上下左右 $4$ 个方向。现要求把闭合圈内的所有空间都填写成 $2$。例如:$6\times 6$ 的方阵($n=6$),涂色前和涂色后的方阵如下:```plain``````plain```## 输入格式每组测试数据第一行一个整数 $n(1 \le n \le 30)$。接下来 $n$ 行,由 $0$ 和 $1$ 组成的 $n \times n$ 的方阵。

m0_73795998的博客 245

(SEED-Lab)Buffer Overflow Vulnerability Lab缓冲区溢出实验

(SEED-Lab)Buffer Overflow Vulnerability Lab 欢迎大家访问我的GitHub博客 https://lunan0320.cn 文章目录一、实验目的二、实验步骤与结果2.1 环境初始化2.2 Task1 运行shellcode2.3漏洞程序2.4 Task 22.5 Task 3: ASLR2.6 Task 4: Stack Guard2.7 Task 5:不可执行栈三、参考文献 一、实验目的 理解缓冲区溢出攻击的原理以及如何实施攻击 理解针对缓冲区溢出的防御措施

lunan的博客 8981

LPDDR5 学习笔记01:功能概述

LPDDR5/LPDDR5X SDRAM设备采用8/16DQ通道架构,支持2Gb-32Gb容量。通过CK命令时钟和更快的WCK数据时钟协同工作,7个CA引脚传输控制信息,支持2:1或4:1的WCK:CK比例。设备提供BG/8B/16B三种存储模式选择,分别支持不同数据速率(最高8.533Gbps)和突发长度。采用0.5V VDDQ电源电压,实现高速双倍数据速率传输,并通过差分WCK时钟完成数据采样。读写采用突发访问机制,需先激活命令再执行读写操作。新型LPDDR5X仅支持BG和16B模式,优化了高速性能。

一只豌豆象的博客 2200

Ubuntu18.04安装高版本TBB(以2021.13.0为例)

以上,则编译你自己的代码时可能会报错:error: 'tbb::task' has not been declared.4、TBBConfig.cmake默认在 /usr/local/lib/cmake/TBB/ 下。5、另外,若不将gcc 和g++版本升级到。1、首先升级gcc 和g++版本到。

weixin_40324045的博客 1412

【立创EDA-PCB设计基础】6.布线铺铜实战及细节详解

本文进行布线铺铜实战及详解布线铺铜的细节

嵌入式阿齐Archie 4万+

java中如何将2021-04-05T13:08:22+08:00转成date呢

java中如何将2021-04-05T13:08:22+08:00转成date呢 public static Date dealDateFormat(String oldDateStr) { DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssXXX"); try { Date date = df.parse(oldDateStr); return date;

qq_43153224的博客 7804

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

上一篇: 洛谷 P1182 数列分段 Section II
下一篇: 洛谷 P2895 [USACO08FEB]Meteor Shower S
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值