Acwing2024蓝桥杯FloodFill

news2024/11/19 4:23:14

AcWing 687. 扫雷

模拟以下样例(10X10):

把扫雷地图转变为数字记录的地图:地雷记作-1,其余表示8个方向有几个地雷,完成后如下图:

接着搜索所有0联通块(为红色矩形),并且把联通块附近不是地雷的点(红色圆形)全标记为-1,如下图:

而答案就是当前该图中大于0的数的数目之和,再加上原来0联通块的数目,dfs(AC):

#include<iostream>
#include<cstring>
using namespace std;
const int N=305;
int T,n;
char a[N][N];   //原地图
int b[N][N];    //数字地图
bool flag[N][N];//标记数组
int dx[8]={-1,-1,0,1,1,1,0,-1};
int dy[8]={0,1,1,1,0,-1,-1,-1};
void dfs(int x,int y){
    if(b[x][y]>0) {b[x][y]=-1;return;}
    for(int i=0;i<8;i++){
        int xx=x+dx[i],yy=y+dy[i];
        if(xx>=1&&xx<=n&&yy>=1&&yy<=n){
            if(!flag[xx][yy]){
                flag[xx][yy]=1;
                if(b[xx][yy]>=0){
                    dfs(xx,yy);
                }
            }
        }
    }
}
int main(){
    cin>>T;
    for(int i=1;i<=T;i++){
        cin>>n;
        cout<<"Case #"<<i<<":"<<" ";
        //地图转换
        for(int i=1;i<=n;i++) 
            for(int j=1;j<=n;j++) 
                {cin>>a[i][j];if(a[i][j]=='*') b[i][j]=-1;}
        for(int i=1;i<=n;i++){
            for(int j=1;j<=n;j++){
                if(a[i][j]=='.'){
                    int t=0;
                    for(int k=0;k<8;k++){
                        int x=i+dx[k],y=j+dy[k];
                        if(x>=1&&x<=n&&y>=1&&y<=n&&a[x][y]=='*'){
                            t++;
                        }
                    }
                    b[i][j]=t;
                }
            }
        }
        //各变量初始化
        int ans=0;
        memset(flag,0,sizeof flag);
        //搜索0联通块,并且计算联通块数目
        for(int i=1;i<=n;i++) 
            for(int j=1;j<=n;j++) 
                if(!flag[i][j]&&b[i][j]==0) {flag[i][j]=1;dfs(i,j);ans++;}
        //计算剩余大于0数的数目,求得答案
        for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) if(b[i][j]>0) ans++;
        cout<<ans<<endl;
    }
    return 0;
}

AcWing 643. 动态网格

模拟+dfs:

#include<iostream>
#include<cstring>
using namespace std;
const int N=105;
int T,R,C,n;
char a[N][N];
bool flag[N][N];
int dx[4]={-1,0,1,0};
int dy[4]={0,1,0,-1};
void dfs(int x,int y){
    flag[x][y]=1;
    for(int i=0;i<4;i++){
        int xx=x+dx[i],yy=y+dy[i];
        if(xx>=0&&xx<R&&yy>=0&&yy<C){
            if(a[xx][yy]=='1'&&flag[xx][yy]==0){
                dfs(xx,yy);
            }
        }
    }
    return ;
}
int main(){
    cin>>T;
    for(int k=1;k<=T;k++){
        cin>>R>>C;
        for(int i=0;i<R;i++) for(int j=0;j<C;j++) cin>>a[i][j];
        cin>>n;
        cout<<"Case #"<<k<<":"<<endl;
        while(n--){
            int ans=0;
            memset(flag,0,sizeof flag);
            char ch;
            cin>>ch;
            if(ch=='M'){
                int x,y,z;
                cin>>x>>y>>z;
                if(z==1) a[x][y]='1';
                else a[x][y]='0';
            }
            else{
                for(int i=0;i<R;i++){
                    for(int j=0;j<C;j++){
                        if(a[i][j]=='1'&&flag[i][j]==0){
                            dfs(i,j);
                            ans++;
                        }
                    }
                }
                cout<<ans<<endl;
            }
        }
    }
    return 0;
}

AcWing 844. 走迷宫

bfs: 

#include<iostream>
#include<cstring>
#include<queue>
using namespace std;
const int N=110;
int n,m;
typedef pair<int,int>pii;
int mapp[N][N],d[N][N];
int bfs(){
    memset(d,-1,sizeof d);
    d[1][1]=0;
    queue<pii>q;
    q.push({1,1});
    int dx[4]={-1,0,1,0},dy[4]={0,1,0,-1};
    while(q.size()){
        auto t=q.front();
        q.pop();
        for(int i=0;i<4;i++){
            int x=t.first+dx[i],y=t.second+dy[i];
            if(x>=1&&x<=n&&y>=1&&y<=m&&d[x][y]==-1&&mapp[x][y]==0){
                d[x][y]=d[t.first][t.second]+1;
                q.push({x,y});
            }
        }
    }
    return d[n][m];
}
int main(){
    cin>>n>>m;
    for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) cin>>mapp[i][j];
    cout<<bfs()<<endl;
    return 0;
}

AcWing 3224. 画图

这题最大的问题就是题目给的坐标不方便,只需要处理好坐标转换,再把两个操作函数写好即可:

#include<iostream>
#include<cstring>
using namespace std;
const int N=105;
int n,m,q;
int dx[4]={-1,0,1,0};
int dy[4]={0,1,0,-1};
char a[N][N];
bool flag[N][N];
//画线函数
void line(int x1,int y1,int x2,int y2){
    if(x1==x2){//同一行
        for(int i=y1;i<=y2;i++){
            if(a[x1][i]=='|'||a[x1][i]=='+') a[x1][i]='+';
            else a[x1][i]='-';
        }
    }
    if(y1==y2){//同一列
        for(int i=x1;i<=x2;i++){
            if(a[i][y1]=='-'||a[i][y1]=='+') a[i][y1]='+';
            else a[i][y1]='|';
        }
    }
    return ;
}
//填充函数
void fills(int x,int y,char c){
    flag[x][y]=1;
    a[x][y]=c;
    for(int i=0;i<4;i++){
        int xx=x+dx[i],yy=y+dy[i];
        if(xx>=0&&xx<n&&yy>=0&&yy<m){
            if(a[xx][yy]!='-'&&a[xx][yy]!='|'&&a[xx][yy]!='+'){
                if(flag[xx][yy]==0){
                    fills(xx,yy,c);
                }
            }
        }
    }
    return ;
}
int main(){
    cin>>m>>n>>q;
    for(int i=0;i<n;i++) for(int j=0;j<m;j++) a[i][j]='.';
    while(q--){
        int t;
        cin>>t;
        if(t==0){
            int x1,y1,x2,y2;//x和y反着读入
            cin>>y1>>x1>>y2>>x2;
            if(x1>x2) swap(x1,x2);
            if(y1>y2) swap(y1,y2);
            line(x1,y1,x2,y2);
        }
        else{
            int x,y;char c;
            cin>>y>>x>>c;//x和y反着读入
            memset(flag,0,sizeof flag);
            fills(x,y,c);
        }
    }
    for(int i=n-1;i>=0;i--){
        for(int j=0;j<m;j++){
            cout<<a[i][j];
        }
        cout<<endl;
    }
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1663982.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

GPT-ArcGIS数据处理、空间分析、可视化及多案例综合应用教程

原文链接&#xff1a;GPT-ArcGIS数据处理、空间分析、可视化及多案例综合应用教程https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&mid2247603080&idx1&sn3e0d7015a2a717c320ebea3a673388ee&chksmfa82126fcdf59b795c7e2cea575470d42480ab809b926be5f94633eac…

国产银河麒麟V10SP1系统下搭建TiDB数据库操作步骤图文

开发目的&#xff1a;在国产银河麒麟系统中搭建TiDB数据库运行环境。 开发工具&#xff1a;银河麒麟系统V10SP1TiDBMySql数据库8.0。 具体步骤&#xff1a; 1、在VmWare虚拟机中安装好国产银河麒麟V10Sp1操作系统。 2、打开终端命令&#xff0c;安装TiDB相关软件&#xff1…

张驰咨询:AI与六西格玛——携手共进,非彼此替代

在历史的洪流中&#xff0c;技术与方法的演进如同波澜壮阔的画卷&#xff0c;不断书写着人类文明的篇章。六西格玛&#xff0c;作为一种追求极致品质与效率的方法论&#xff0c;是现代工业文明中的瑰宝。而当我们面对AI&#xff08;人工智能&#xff09;这一新时代的产物时&…

安卓模拟器Frida环境搭建 (mumu+adb+frida)

安卓模拟器Frida环境搭建 &#xff08;mumuadbfrida&#xff09; mumu模拟器安装adb与frida下载mumuadbfrida配置一般的报错实战 针对apk抓包问题&#xff0c;有的时候Android9已经不适用于现在的需求&#xff0c;需要更高的Android版本&#xff0c;mumu模拟器提供了Android12的…

【经验总结】Vue2中的全局变量(store

需求场景 需要在vue中存储一个可变的&#xff0c;可读写的全局变量在不同的js、页面中均可调用和读写 技术&#xff1a;使用vue的store 用法总结 一、定义变量 1、找到vue的/src/store路径&#xff0c;在modules文件夹下创建文件&#xff08;这里便于测试创建demo.js&…

Linux下安装JDK并配置环境变量

一、Oracle官网下载jdk 1、官网地址 https://www.oracle.com/java/technologies/downloads/#java17 2、命令下载 wget https://download.oracle.com/java/17/latest/jdk-17_linux-x64_bin.tar.gz 3、解压 tar -zxvf jdk-17_linux-x64_bin.tar.gz 4、配置环境变量 ec…

HarmonyOS开发案例:【生活健康app之获取成就】(3)

获取成就 本节将介绍成就页面。 功能概述 成就页面展示用户可以获取的所有勋章&#xff0c;当用户满足一定的条件时&#xff0c;将点亮本页面对应的勋章&#xff0c;没有得到的成就勋章处于熄灭状态。共有六种勋章&#xff0c;当用户连续完成任务打卡3天、7天、30天、50天、…

IP地址127.0.0.1的误解:一次投标监管的技术失误

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

selenium进行xhs图片爬虫:03获取一篇图文的图片

&#x1f4da;博客主页&#xff1a;knighthood2001 ✨公众号&#xff1a;认知up吧 &#xff08;目前正在带领大家一起提升认知&#xff0c;感兴趣可以来围观一下&#xff09; &#x1f383;知识星球&#xff1a;【认知up吧|成长|副业】介绍 ❤️感谢大家点赞&#x1f44d;&…

出海企业哪种组网方案更省事?

对于出海企业而言&#xff0c;建立跨地区的数据传输和协同工作至关重要&#xff0c;以提升运营效率。因此&#xff0c;网络构建变得迫在眉睫。通过构建企业组网&#xff0c;企业能够加强与海外分支、客户和合作伙伴之间的联系&#xff0c;加速海外业务的发展。 然而&#xff0c…

深兰科技荣获中国机器人行业年度独角兽企业奖

近日&#xff0c;“维科杯OFweek 2023人工智能产业大会暨行业年度评选颁奖典礼“在深圳隆重举行。经OFweek网络投票、专家组评审及组委会综合评审三轮激烈紧张的评审筛选&#xff0c;通过对近300个参评项目的综合实力考量&#xff0c;最终深兰科技成功荣膺“维科杯OFweek2023中…

计算机视觉——OpenCV实现Lucas-Kanade 光流追踪

1.光流 光流法是计算机视觉中用于估计图像序列中物体运动的关键技术。它类似于观察夜空中的彗星&#xff0c;通过其在天空中的运动轨迹来追踪它的路径。在图像处理中&#xff0c;光流帮助我们理解像素点如何在连续的帧之间移动。 1.1 稀疏光流法 稀疏光流法关注于图像中的关…

js实现复制功能

/*** 复制* param {*} val 要复制的内容* returns*/ export const copyToClipboard async val > {try {// 使用现代 API 尝试复制if (navigator.clipboard && navigator.permissions) {await navigator.clipboard.writeText(val)return // 如果成功&#xff0c;直接…

pikachu靶场-全套学习

文章目录 配置pikachu靶场浏览器访问过程burpsuite配置代理hackbar安装使用kali安装中国蚁剑暴力破解cookie简化场景解释各部分含义如何工作 基于表单的暴力破解验证码绕过(On server)验证码绕过(on client)token防爆破? XSS&#xff08;Cross-Site Scripting跨站脚本攻击 &am…

Linux下安装mysql8.0(以tar.xz包安装--编译安装)

前言&#xff1a;原文在我的博客网站中&#xff0c;持续更新数通、系统方面的知识&#xff0c;欢迎来访&#xff01; Linux下安装mysql8.0&#xff08;以tar.xz包安装--编译安装&#xff09;https://myweb.myskillstree.cn/126.html 目录 一、下载对应自己glic版本的MySQL …

Linux x86_64 dump_stack()函数基于FP栈回溯

文章目录 前言一、dump_stack函数使用二、dump_stack函数源码解析2.1 show_stack2.2 show_stack_log_lvl2.3 show_trace_log_lvl2.4 dump_trace2.5 print_context_stack 参考资料 前言 Linux x86_64 centos7 Linux&#xff1a;3.10.0 一、dump_stack函数使用 dump_stack函数…

【Python基础】装饰器(3848字)

文章目录 [toc]闭包什么是装饰器装饰器示例不使用装饰器语法使用装饰器语法 装饰器传参带参数的装饰器类装饰器魔术方法\__call__()类装饰器示例带参数类装饰器property装饰器分页操作商品价格操作 个人主页&#xff1a;丷从心 系列专栏&#xff1a;Python基础 学习指南&…

Redis不同数据类型value存储

一、Strings redis中String的底层没有用c的char来实现&#xff0c;而是使用SDS数据结构( char buf[])。 缺点:浪费空间 优势: 1.c字符串不记录自身的长度&#xff0c;所以获取一个字符串长度的复杂度是O(N),但是SDS记录分配的长度alloc,已使用长度len&#xff0c;获取长度的…

资深测试必备技能!TestNG自动化测试框架实战详解

1、TestNG导言 在软件测试工作中&#xff0c;自动测试框架是不可或缺的&#xff0c;之前有Junit和Nunit框架&#xff0c;后有TestNG。TestNG不但吸取了Junit和Nunit框架的思想&#xff0c;而且创造了更强大的功能&#xff0c;它不但是单元测试框架&#xff0c;同时也是集成自动…

Qt Tab键切换焦点顺序:setTabOrder()

使用这个方法setTabOrder()&#xff0c;设置使得焦点的顺序从前到后依次是&#xff1a; ui->lineEdit》 ui->lineEdit_2》ui->lineEdit_3 》ui->lineEdit_4 焦点先在ui->lineEdit上&#xff0c;当按下Tab键时&#xff0c;焦点跑到ui->lineEdit_2上。。。按…