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;
}

 



posted @ 2021-03-01 19:34  mikku  阅读(99)  评论(0)    收藏  举报