2020 BIT冬训-图&&DFS&&BFS 北京理工大学第八届程序设计新生赛 H(cy)
Problem Description
小时候,你一定玩过七巧板对吧?由七块彩色的方块组成,能够拼成各种有趣而生动的图案。
shenyunhan 发明了一种新的玩具叫方块板,它由大大小小的矩形方块组成。如下图所示,方块板玩具是由若干块不同颜色的小矩形方块组成的大矩形方块。
我们将这个方块板玩具视为二维彩色矩形像素图,它由若干颜色相异的小矩形组成。在这个问题中,我们将给出每种颜色的小矩形方块的某一块像素所在位置,请聪明的你重新还原出整块方块板的布局吧!
Input
第一行输入两个正整数 n 和 m (1 ≤ n, m ≤ 300),描述整块方块板像素图的长和宽。
接下来 n 行,每行输入 m 个字符,输入字符形由 . 或大写字母 A 到 Z 组成,若第 i 行第 j 列的字符为 . 则表示这块像素的颜色未知,若字符为大写字母 A 到 Z 则标识着块像素的颜色。
输入保证方块板的任意两块小矩形方块的颜色都不相同。
Output
请输出还原以后的方块板布局,若存在多种方块板布局方案,你可以输出其中任意一种合法的布局方案,题目保证输入至少存在一种合法的布局方案。
Example
Input
5 8 ......S. .Y...... ...H.... ......A. ..K.....
Output
SSSSSSSS YYYYYYYY HHHHHHHH AAAAAAAA KKKKKKKK
这题还是没想明白怎么做的。随机填充也感觉很奇怪。
虽然第二个思路确实和我一开始想的一样。就是贪心的分割矩形块。但我一直想不到如何去实现。。
网上题解也挺少。所以先cy。以后再说吧。
题解
![]()
AC代码如下:
#include <algorithm> #include<iostream> #include<cstdio> #include<cstring> #include<vector> #include<random> #include<ctime> using namespace std; const int MAXN = 1005; int n, m; char g[MAXN][MAXN], h[MAXN][MAXN]; struct Node{ char c; int x, y; Node() {} Node(char c, int x, int y) : c(c), x(x), y(y) {} }; vector<Node> v; int l[MAXN], r[MAXN]; bool solve(){ for (int i=1;i<=n;i++) strcpy(h[i] + 1,g[i]+1); shuffle(v.begin(),v.end(),mt19937(rand())); int x1,x2,y1,y2; for(auto& p:v){ char c=p.c; for(y1=p.y;h[p.x][y1-1]=='.';y1--); for(y2=p.y;h[p.x][y2+1]=='.';y2++); for(x1=p.x;;x1--){ bool flag=1; for(int j=y1;j<=y2;j++) if(h[x1-1][j]!= '.'){ flag=0; break; } if(!flag) break; } for (x2=p.x;;x2++){ bool flag=1; for (int j=y1; j<=y2; j++) if(h[x2+1][j]!='.'){ flag=0; break; } if(!flag) break; } for(int i=x1;i<=x2;i++) for(int j=y1;j<=y2;j++) if(h[i][j]=='.') h[i][j]=c; } for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) if(h[i][j]=='.') return 1; for(int i=1;i<=n;i++) printf("%s\n",h[i]+1); return 0; } int main(){ srand(time(0)^666); scanf("%d%d",&n,&m); for (int i=1;i<=n;i++){ scanf("%s",g[i]+1); for(int j=1;j<=m;j++) if(isupper(g[i][j])){ v.emplace_back(g[i][j],i,j); } } while(solve()); return 0; }


浙公网安备 33010602011771号