CF525D Arthur and Walls

https://www.luogu.com.cn/problem/CF525D
搜索,DFS染色
黄色题

思路

贪心+DFSDFS染色,算法其实很好想,考虑哪些*∗点是必须被替换的:

通过观察,我们发现,一个*点要被替换,当且仅当有一个包含它的2×2的矩阵中除它之外全是..点(当我们已经将其他需要替换的*∗点替换掉时)

证明: 当一个*点联通块需要被替换时,块内必然有一个*点被.点半包围(因为只有这样它才会阻碍..点组成矩形),于是我们将改点替换成.点。不难发现,块内剩下的*点又可以通过同样的方式判断

  • DFS每次应向周围8个点拓展;
  • 判断半包围时请老老实实列举每一种情况;
  • 判断或拓展新点时应确保其在图内
  • 只能*.不能反过来换
  • 复制代码
    #include<bits/stdc++.h> using namespace std; int n,m; char a[2005][2005]; void dfs(int x,int y) { if(x<0||x>=n||y<0||y>=m||a[x][y]=='.')return;//防越界和.跳出 if((a[x+1][y]=='.'&&a[x+1][y+1]=='.'&&a[x][y+1]=='.')||(a[x-1][y]=='.'&&a[x-1][y-1]=='.'&&a[x][y-1]=='.')||(a[x+1][y]=='.'&&a[x+1][y-1]=='.'&&a[x][y-1]=='.')||(a[x-1][y]=='.'&&a[x-1][y+1]=='.'&&a[x][y+1]=='.'))a[x][y]='.';//可以分四个if写 else return;//不需要改变就跳出 dfs(x+1,y);//可以用方向数组 dfs(x-1,y); dfs(x+1,y+1); dfs(x-1,y-1); dfs(x+1,y-1); dfs(x-1,y+1); dfs(x,y+1); dfs(x,y-1); } int main() { cin>>n>>m; for(int i=0;i<n;i++) for(int j=0;j<m;j++) { a[i][j]=getchar();//输入时无空格,所以cin不方便 if(a[i][j]=='\n')//输入时注意换行 a[i][j]=getchar(); } for(int i=0;i<n;i++) for(int j=0;j<m;j++) if(a[i][j]=='*') dfs(i,j); for(int i=0;i<n;i++)//输出矩阵而不是次数 { for(int j=0;j<m;j++) cout<<a[i][j]; cout<<endl; } return 0; }
    复制代码

     


__EOF__

本文作者灰の魔女伊蕾娜
本文链接https://www.cnblogs.com/2elaina/p/16576325.html
关于博主:编程小萌新一名,希望从今天开始慢慢提高,一步步走向技术的高峰!
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   -イレイナ  阅读(10)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示