题解 UVA11520 【Fill the Square】

1|0又是一道蓝书上的题呢。

楼下的咋是直接抄蓝书的啊,我觉得吧做题要有自己的思想,我看到这道题,第一个想的就是bfs。大概就是直接搜每一个点。

  • 如果这个点本来就有字母,那就直接把这个字符存入答案

  • 否则从AZ枚举,如这个点四周没有相同的字符就把这个字符存入答案,然后直接break,因为要字典序最小的,而因为是从AZ枚举,所以每次先找到的可行解一定是字典序最小的

1|0CODE(STL实现)

#include <iostream> #include <cstring> #include <cstdio> #include <queue> using std::queue; using std::cin; using std::cout; using std::ios; const int dx[4]={0,0,-1,1},dy[4]={1,-1,0,0}; int n,T; int vis[3242][3422]; char map[324][234]; char ans[324][234]; inline bool in_side(int x,int y) { return (x>0 && x<=n && y>0 && y<=n); } inline bool check(int x,int y,char xs) { int ok=1; for(int i=0; i<4; i++) { int sx=x+dx[i],sy=y+dy[i]; if(in_side(sx,sy) && (ans[sx][sy] == xs)) { ok=0; break; } } return ok; } struct node { int x,y; }; inline void bfs(int x,int y) { queue<node> Q; Q.push({x,y}); while(!Q.empty()) { node fr=Q.front(); Q.pop(); if(ans[fr.x][fr.y] == '.') { for(int ch='A'; ch<='Z'; ch++) { if(check(fr.x,fr.y,ch)) { ans[fr.x][fr.y]=ch; break; } } } for(int i=0; i<4; i++) { int sx=fr.x+dx[i],sy=fr.y+dy[i]; if(in_side(sx,sy) && !vis[sx][sy]) { vis[sx][sy]=1; Q.push({sx,sy}); } } // printf("ans[%d][%d]=%c\n",fr.x,fr.y,ans[fr.x][fr.y]); } } int main() { scanf("%d",&T); for(int Case=1; Case<=T; Case++) { memset(vis,0,sizeof vis); scanf("%d",&n); for(int i=1; i<=n; i++) { for(int j=1; j<=n; j++) { cin>>map[i][j]; ans[i][j]=map[i][j]; } } vis[1][1]=1; bfs(1,1); printf("Case %d:\n",Case); for(int i=1; i<=n; i++) { for(int j=1; j<=n; j++) { printf("%c",ans[i][j]); } printf("\n"); } } return 0; }

__EOF__

本文作者Kdlyh
本文链接https://www.cnblogs.com/kdlyh/p/17777025.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   加固文明幻景  阅读(5)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下
点击右上角即可分享
微信分享提示