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


    题目传送门

     1 /*
     2     题意:问最少替换'*'为'.',使得'.'连通的都是矩形
     3     BFS:搜索想法很奇妙,先把'.'的入队,然后对于每个'.'八个方向寻找
     4         在2*2的方格里,若只有一个是'*',那么它一定要被替换掉
     5 */
     6 #include <cstdio>
     7 #include <iostream>
     8 #include <algorithm>
     9 #include <cstring>
    10 #include <queue>
    11 using namespace std;
    12 
    13 const int MAXN = 2e3 + 10;
    14 const int INF = 0x3f3f3f3f;
    15 int n, m;
    16 int dx[4][3] = {{1,0,1},{0,-1,-1},{-1,-1,0},{1,1,0}};
    17 int dy[4][3] = {{0,1,1},{1,0,1},{0,-1,-1},{0,-1,-1}};
    18 char s[MAXN][MAXN];
    19 
    20 bool ok(int x, int y)
    21 {
    22     if (x < 0 || x >= n)    return false;
    23     if (y < 0 || y >= m)    return false;
    24 
    25     return true;
    26 }
    27 
    28 void BFS(void)
    29 {
    30     queue<pair<int, int> > Q;
    31     for (int i=0; i<n; ++i)
    32     {
    33         for (int j=0; j<m; ++j)
    34         {
    35             if (s[i][j] == '.')
    36             {
    37                 Q.push (make_pair (i, j));
    38             }
    39         }
    40     }
    41 
    42     while (!Q.empty ())
    43     {
    44         int x = Q.front ().first;    int y = Q.front ().second;
    45         Q.pop ();
    46         for (int i=0; i<4; ++i)
    47         {
    48             int cnt = 0;    int px, py;    bool flag = true;
    49             for (int j=0; j<3; ++j)
    50             {
    51                 int tx = x + dx[i][j];    int ty = y + dy[i][j];
    52                 if (ok (tx, ty))
    53                 {
    54                     if (s[tx][ty] == '*')
    55                     {
    56                         cnt++;    px = tx;    py = ty;
    57                     }
    58                 }
    59                 else    flag = false;
    60             }
    61             if (flag && cnt == 1)
    62             {
    63                 s[px][py] = '.';    Q.push (make_pair (px, py));
    64             }
    65         }
    66     }
    67 }
    68 
    69 int main(void)        //Codeforces Round #297 (Div. 2) D. Arthur and Walls
    70 {
    71     while (scanf ("%d%d", &n, &m) == 2)
    72     {
    73         for (int i=0; i<n; ++i)    scanf ("%s", s[i]);
    74         BFS ();
    75         for (int i=0; i<n; ++i)    printf ("%s
    ", s[i]);
    76     }
    77 
    78     return 0;
    79 }
    80 
    81 
    82 /*
    83 5 5
    84 .*.*.
    85 *****
    86 .*.*.
    87 *****
    88 .*.*.
    89 6 7
    90 ***.*.*
    91 ..*.*.*
    92 *.*.*.*
    93 *.*.*.*
    94 ..*...*
    95 *******
    96 */
    编译人生,运行世界!
  • 相关阅读:
    2018 Wannafly summer camp Day2--New Game!
    2018 Wannafly summer camp Day8--区间权值
    2018 Wannafly summer camp Day3--Shopping
    2018 Wannafly summer camp Day3--Travel
    HDU 6354--Everything Has Changed(判断两圆关系+弧长计算)
    Spring boot-(2) Spring Boot使用
    Spring boot-(1) Spring Boot快速开始
    Quartz使用(5)
    Quartz使用(4)
    Quartz使用(3)
  • 原文地址:https://www.cnblogs.com/Running-Time/p/4534492.html
Copyright © 2020-2023  润新知