题解 UVA11520 【Fill the Square】
又是一道蓝书上的题呢。
楼下的咋是直接抄蓝书的啊,我觉得吧做题要有自己的思想,我看到这道题,第一个想的就是bfs。大概就是直接搜每一个点。
-
如果这个点本来就有字母,那就直接把这个字符存入答案
-
否则从$'A'$到$'Z'$枚举,如这个点四周没有相同的字符就把这个字符存入答案,然后直接break,因为要字典序最小的,而因为是从$'A'$到$'Z'$枚举,所以每次先找到的可行解一定是字典序最小的。
CODE(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;
}