Acwing2024蓝桥杯FloodFill

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.hqwc.cn/news/688904.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深入理解JavaScript事件循环Event Loop:宏任务与微任务的奇幻之旅

&#x1f525; 个人主页&#xff1a;空白诗 文章目录 &#x1f389; 引言&#x1f31f; 什么是事件循环&#xff1f;&#x1f4da; 「宏任务」 vs 「微任务」「宏任务」(Macrotask)「微任务」(Microtask)实际应用中的注意事项 &#x1f500; 执行流程概览&#x1f4dd; 代码示例…

【数据结构】二叉树(Binary Tree)

文章目录 一、树的概念及结构二、二叉树的概念及结构1.二叉树的概念2.特殊的二叉树3.二叉树的性质 三、二叉树的存储顺序存储链式存储 四、二叉树的实现1.创建二叉树2.二叉树的遍历前序遍历中序遍历后序遍历层序遍历根据遍历顺序创建二叉树 3.二叉树的基本操作1.总结点个数2.二…

国内运营商选择爱立信,或因它的低频5G技术更先进,价格更便宜

国内某运营商将大笔5G设备订单交给爱立信&#xff0c;引发了掀然大波&#xff0c;影响仍在扩散&#xff0c;对此各方说什么原因都有&#xff0c;笔者认为爱立信此次斩获大单&#xff0c;可能在于它的低频5G设备更先进&#xff0c;价格更便宜&#xff0c;对于急于降低成本的国内…

融知财经:期货和现货的区别是什么?哪个风险大?

期货和现货在交易对象等方面存在明显的区别。期货交易是一种衍生金融工具&#xff0c;主要用于价格发现、风险管理和投机&#xff0c;而现货交易则是商品和服务的实际买卖。在选择进行期货交易还是现货交易时&#xff0c;投资者需要根据自己的需求和市场情况来决定。 期货和现货…

智能驱动,精准管理:打造高效干部管理系统

干部管理系统是现代组织管理中不可或缺的工具&#xff0c;它通过信息技术的应用&#xff0c;提高了干部管理的效率和准确性。干部管理系统的主要功能包括&#xff1a; 1. 信息管理&#xff1a;系统可以存储和管理干部的个人信息&#xff0c;包括基本资料、工作经历、教育背景、…

Gitlab搭建

Gitlab搭建 一.gitlab安装二.gitlab安装目录三.gitlab常用命令汇总四.gitlab访问测试1.登录gitlab2.配置默认访问密码3.登陆自己创建的账户 五.gitlab图形化操作1.gitlab关闭自动注册2.gitlab免密登录3.gitlab创建项目4.使用管理员创建账户5.gitlab 添加邮箱设置5.1开启SMTP功能…

基于Python的数据分组技术:将数据按照1, 2, 3规则分为三个列表

目录 一、引言 二、数据分组原理与意义 三、案例分析 四、代码实现与解释 五、对新手友好的解释 六、技术细节与扩展 七、实际应用场景 八、总结 一、引言 在数据处理和分析的广阔领域中&#xff0c;数据分组是一项基础且重要的任务。数据分组通常指的是将数据集中的元…

Mac idea gradle解决异常: SSL peer shut down incorrectly

系统&#xff1a;mac 软件&#xff1a;idea 解决异常: SSL peer shut down incorrectly 查看有没有安装 gradle -v安装 根据项目gradle提示安装版本 brew install gradle7idea的配置 在settings搜索gradle&#xff0c;配置Local installation&#xff0c;选择自己的安装目录…

VS远程调试

因为是做工厂应用的客制化项目&#xff0c;在客户现场出现异常&#xff0c;本地又很难复现&#xff0c;而且重启软件可能又自动恢复了&#xff0c;此时可以用VisualStudio自带的远程调试功能进行调试&#xff0c;不需要重启软件&#xff0c;能较好的定位问题。客户电脑上不需要…

代码随想录第四十九天|买卖股票的最佳时机Ⅲ、买卖股票的最佳时机Ⅳ

题目链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 题目链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 买卖股票的最佳时机Ⅲ、买卖股票的最佳时机Ⅳ两道题目非常相似&#xff0c;只是次数为已知的两次与k次的区别&#xff0c;而与买卖股票的最佳时…

Python读取base64图片数据

Python读取base64图片数据 在Python中&#xff0c;可以使用base64模块来解码Base64编码的字符串&#xff0c;并将其转换回原始的数据&#xff08;如图片&#xff09;。但通常&#xff0c;Base64编码的图片字符串会带有前缀&#xff08;如data:image/jpeg;base64,&#xff09;&…

按键配合LDO实现开关功能

今天给大家分享一个学到的按键开关电路&#xff0c;适合没有足够空间给自锁开关的场景&#xff0c;既可以用于USB供电控制也可以用于电池供电控制。话不多说上电路图先。 核心任务就是通过按键控制LDO芯片的使能管脚的电平状态&#xff0c;这枚NCP芯片高电平使能&#xff0c;VB…