0
点赞
收藏
分享

微信扫一扫

D. Arthur and Walls(Codeforces Round #297 (Div. 2) 搜索(BFS))


D. Arthur and Walls



time limit per test



memory limit per test



input



output


Finally it is a day when Arthur has enough money for buying an apartment. He found a great option close to the center of the city with a nice price.

n × m consisting of squares of size 1 × 1. Each of those squares contains either a wall (such square is denoted by a symbol "*" on the plan) or a free space (such square is denoted on the plan by a symbol ".").

Room in an apartment is a maximal connected area consisting of free squares. Squares are considered adjacent if they share a common side.

The old Arthur dream is to live in an apartment where all rooms are rectangles. He asks you to calculate minimum number of walls you need to remove in order to achieve this goal. After removing a wall from a square it becomes a free square. While removing the walls it is possible that some rooms unite into a single one.


Input



n, m (1 ≤ n, m ≤ 2000) denoting the size of the Arthur apartments.

n lines each contain m

*" then it contains a wall.

." then it this cell is free from walls and also this cell is contained in some of the rooms.


Output



n rows each consisting of m

If there are several possible answers, output any of them.


Sample test(s)



input



5 5 .*.*. ***** .*.*. ***** .*.*.



output



.*.*. ***** .*.*. ***** .*.*.



input



6 7 ***.*.* ..*.*.* *.*.*.* *.*.*.* ..*...* *******



output



***...* ..*...* ..*...* ..*...* ..*...* *******



input



4 5 ..... ..... ..*** ..*..



output



#include<iostream>
#include<algorithm>
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<queue>

using namespace std;

struct node
{
    int x;
    int y;
    //int cnt;
};

int n,m;
char map[2015][2015];
queue<node>q;

void BFS()
{
    struct node t,f;
    while(!q.empty())
    {
        t = q.front();
        q.pop();
        int i = t.x;
        int j = t.y;
        int x1,x2,x3,y1,y2,y3;
        struct node tt;
        for(int k=0; k<4; k++)
        {
            int cnt = 0;
            int ans = 0;
            if(k == 0)
            {
                x1 = i - 1;
                y1 = j;
                x2 = i - 1;
                y2 = j - 1;
                x3 = i;
                y3 = j - 1;
                if(map[i][j] == '.')
                {
                    cnt++;
                }
                else
                {
                    ans++;
                    tt.x = i;
                    tt.y = j;
                }
                if(map[x1][y1] == '.')
                {
                    cnt++;
                }
                else
                {
                    ans++;
                    tt.x = x1;
                    tt.y = y1;
                }
                if(map[x2][y2] == '.')
                {
                    cnt++;
                }
                else
                {
                    ans++;
                    tt.x = x2;
                    tt.y = y2;
                }
                if(map[x3][y3] == '.')
                {
                    cnt++;
                }
                else
                {
                    ans++;
                    tt.x = x3;
                    tt.y = y3;
                }
                if(x1<0 || x2<0 || x3 < 0 || x1>=n ||x2>=n || x3>=n || y1<0 || y2<0 || y3 < 0 || y1>=m ||y2>=m || y3>=m || cnt!=3 || ans!=1)
                {
                    continue;
                }
                map[tt.x][tt.y] = '.';
                q.push(tt);
            }
            else if(k == 1)
            {
                x1 = i;
                y1 = j + 1;
                x2 = i - 1;
                y2 = j;
                x3 = i - 1;
                y3 = j + 1;
                if(map[i][j] == '.')
                {
                    cnt++;
                }
                else
                {
                    ans++;
                    tt.x = i;
                    tt.y = j;
                }
                if(map[x1][y1] == '.')
                {
                    cnt++;
                }
                else
                {
                    ans++;
                    tt.x = x1;
                    tt.y = y1;
                }
                if(map[x2][y2] == '.')
                {
                    cnt++;
                }
                else
                {
                    ans++;
                    tt.x = x2;
                    tt.y = y2;
                }
                if(map[x3][y3] == '.')
                {
                    cnt++;
                }
                else
                {
                    ans++;
                    tt.x = x3;
                    tt.y = y3;
                }
                if(x1<0 || x2<0 || x3 < 0 || x1>=n ||x2>=n || x3>=n || y1<0 || y2<0 || y3 < 0 || y1>=m ||y2>=m || y3>=m || cnt!=3 || ans!=1)
                {
                    continue;
                }
                map[tt.x][tt.y] = '.';
                q.push(tt);
            }
            else if(k == 2)
            {
                x1 = i;
                y1 = j - 1;
                x2 = i + 1;
                y2 = j - 1;
                x3 = i + 1;
                y3 = j;
                if(map[i][j] == '.')
                {
                    cnt++;
                }
                else
                {
                    ans++;
                    tt.x = i;
                    tt.y = j;
                }
                if(map[x1][y1] == '.')
                {
                    cnt++;
                }
                else
                {
                    ans++;
                    tt.x = x1;
                    tt.y = y1;
                }
                if(map[x2][y2] == '.')
                {
                    cnt++;
                }
                else
                {
                    ans++;
                    tt.x = x2;
                    tt.y = y2;
                }
                if(map[x3][y3] == '.')
                {
                    cnt++;
                }
                else
                {
                    ans++;
                    tt.x = x3;
                    tt.y = y3;
                }
                if(x1<0 || x2<0 || x3 < 0 || x1>=n ||x2>=n || x3>=n || y1<0 || y2<0 || y3 < 0 || y1>=m ||y2>=m || y3>=m || cnt!=3 || ans!=1)
                {
                    continue;
                }
                map[tt.x][tt.y] = '.';
                q.push(tt);
            }
            else if(k == 3)
            {
                x1 = i + 1;
                y1 = j + 1;
                x2 = i + 1;
                y2 = j;
                x3 = i;
                y3 = j + 1;
                if(map[i][j] == '.')
                {
                    cnt++;
                }
                else
                {
                    ans++;
                    tt.x = i;
                    tt.y = j;
                }
                if(map[x1][y1] == '.')
                {
                    cnt++;
                }
                else
                {
                    ans++;
                    tt.x = x1;
                    tt.y = y1;
                }
                if(map[x2][y2] == '.')
                {
                    cnt++;
                }
                else
                {
                    ans++;
                    tt.x = x2;
                    tt.y = y2;
                }
                if(map[x3][y3] == '.')
                {
                    cnt++;
                }
                else
                {
                    ans++;
                    tt.x = x3;
                    tt.y = y3;
                }
                if(x1<0 || x2<0 || x3 < 0 || x1>=n ||x2>=n || x3>=n || y1<0 || y2<0 || y3 < 0 || y1>=m ||y2>=m || y3>=m || cnt!=3 || ans!=1)
                {
                    continue;
                }
                map[tt.x][tt.y] = '.';
                q.push(tt);
            }
        }
    }
    for(int i=0; i<n; i++)
    {
        printf("%s\n",map[i]);
    }
}

int main()
{
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        while(!q.empty())
        {
            q.pop();
        }
        for(int i=0; i<n; i++)
        {
            scanf("%s",map[i]);
        }
        for(int i=0; i<n; i++)
        {
            for(int j=0; j<m; j++)
            {
                int x1,x2,x3,y1,y2,y3;
                struct node tt;
                for(int k=0; k<4; k++)
                {
                    int cnt = 0;
                    int ans = 0;
                    if(k == 0)
                    {
                        x1 = i - 1;
                        y1 = j;
                        x2 = i - 1;
                        y2 = j - 1;
                        x3 = i;
                        y3 = j - 1;
                        if(map[i][j] == '.')
                        {
                            cnt++;
                        }
                        else
                        {
                            ans++;
                            tt.x = i;
                            tt.y = j;
                        }
                        if(map[x1][y1] == '.')
                        {
                            cnt++;
                        }
                        else
                        {
                            ans++;
                            tt.x = x1;
                            tt.y = y1;
                        }
                        if(map[x2][y2] == '.')
                        {
                            cnt++;
                        }
                        else
                        {
                            ans++;
                            tt.x = x2;
                            tt.y = y2;
                        }
                        if(map[x3][y3] == '.')
                        {
                            cnt++;
                        }
                        else
                        {
                            ans++;
                            tt.x = x3;
                            tt.y = y3;
                        }
                        if(x1<0 || x2<0 || x3 < 0 || x1>=n ||x2>=n || x3>=n || y1<0 || y2<0 || y3 < 0 || y1>=m ||y2>=m || y3>=m || cnt!=3 || ans!=1)
                        {
                            continue;
                        }
                        map[tt.x][tt.y] = '.';
                        q.push(tt);
                    }
                    else if(k == 1)
                    {
                        x1 = i;
                        y1 = j + 1;
                        x2 = i - 1;
                        y2 = j;
                        x3 = i - 1;
                        y3 = j + 1;
                        if(map[i][j] == '.')
                        {
                            cnt++;
                        }
                        else
                        {
                            ans++;
                            tt.x = i;
                            tt.y = j;
                        }
                        if(map[x1][y1] == '.')
                        {
                            cnt++;
                        }
                        else
                        {
                            ans++;
                            tt.x = x1;
                            tt.y = y1;
                        }
                        if(map[x2][y2] == '.')
                        {
                            cnt++;
                        }
                        else
                        {
                            ans++;
                            tt.x = x2;
                            tt.y = y2;
                        }
                        if(map[x3][y3] == '.')
                        {
                            cnt++;
                        }
                        else
                        {
                            ans++;
                            tt.x = x3;
                            tt.y = y3;
                        }
                        if(x1<0 || x2<0 || x3 < 0 || x1>=n ||x2>=n || x3>=n || y1<0 || y2<0 || y3 < 0 || y1>=m ||y2>=m || y3>=m || cnt!=3 || ans!=1)
                        {
                            continue;
                        }
                        map[tt.x][tt.y] = '.';
                        q.push(tt);
                    }
                    else if(k == 2)
                    {
                        x1 = i;
                        y1 = j - 1;
                        x2 = i + 1;
                        y2 = j - 1;
                        x3 = i + 1;
                        y3 = j;
                        if(map[i][j] == '.')
                        {
                            cnt++;
                        }
                        else
                        {
                            ans++;
                            tt.x = i;
                            tt.y = j;
                        }
                        if(map[x1][y1] == '.')
                        {
                            cnt++;
                        }
                        else
                        {
                            ans++;
                            tt.x = x1;
                            tt.y = y1;
                        }
                        if(map[x2][y2] == '.')
                        {
                            cnt++;
                        }
                        else
                        {
                            ans++;
                            tt.x = x2;
                            tt.y = y2;
                        }
                        if(map[x3][y3] == '.')
                        {
                            cnt++;
                        }
                        else
                        {
                            ans++;
                            tt.x = x3;
                            tt.y = y3;
                        }
                        if(x1<0 || x2<0 || x3 < 0 || x1>=n ||x2>=n || x3>=n || y1<0 || y2<0 || y3 < 0 || y1>=m ||y2>=m || y3>=m || cnt!=3 || ans!=1)
                        {
                            continue;
                        }
                        map[tt.x][tt.y] = '.';
                        q.push(tt);
                    }
                    else if(k == 3)
                    {
                        x1 = i + 1;
                        y1 = j + 1;
                        x2 = i + 1;
                        y2 = j;
                        x3 = i;
                        y3 = j + 1;
                        if(map[i][j] == '.')
                        {
                            cnt++;
                        }
                        else
                        {
                            ans++;
                            tt.x = i;
                            tt.y = j;
                        }
                        if(map[x1][y1] == '.')
                        {
                            cnt++;
                        }
                        else
                        {
                            ans++;
                            tt.x = x1;
                            tt.y = y1;
                        }
                        if(map[x2][y2] == '.')
                        {
                            cnt++;
                        }
                        else
                        {
                            ans++;
                            tt.x = x2;
                            tt.y = y2;
                        }
                        if(map[x3][y3] == '.')
                        {
                            cnt++;
                        }
                        else
                        {
                            ans++;
                            tt.x = x3;
                            tt.y = y3;
                        }
                        if(x1<0 || x2<0 || x3 < 0 || x1>=n ||x2>=n || x3>=n || y1<0 || y2<0 || y3 < 0 || y1>=m ||y2>=m || y3>=m || cnt!=3 || ans!=1)
                        {
                            continue;
                        }
                        map[tt.x][tt.y] = '.';
                        q.push(tt);
                    }
                }
            }
        }
        BFS();
    }
    return 0;
}

举报

相关推荐

0 条评论