码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2015-05-27 22:38:45      阅读:187      评论:0      收藏:0      [点我收藏+]

标签:

 

题目传送门

 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\n", 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 */

 

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

标签:

原文地址:http://www.cnblogs.com/Running-Time/p/4534492.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!