cf 525D.Arthur and Walls

判断2*2的正方形,是不是3个"."1个"*"然后暴力bfs就好。(这种处理也是挺神奇的2333%%题解)

 1 #include<bits/stdc++.h>
 2 #define INF 0x7fffffff
 3 #define LL long long
 4 #define N 100005
 5 #define pill pair<int ,int > 
 6 using namespace std;
 7 inline int ra()
 8 {
 9     int x=0,f=1; char ch=getchar();
10     while (ch<'0' || ch>'9') {if (ch=='-') f=-1; ch=getchar();}
11     while (ch>='0' && ch<='9') {x=x*10+ch-'0'; ch=getchar();}
12     return x*f;
13 }
14 const int dir_x[4][3] = {{1,0,1},{0,-1,-1},{-1,-1,0},{1,1,0}};  
15 const int dir_y[4][3] = {{0,1,1},{1,0,1},{0,-1,-1},{0,-1,-1}}; 
16 char mat[2005][2005];
17 int n,m; 
18 void bfs()
19 {
20     queue<pair<int ,int > > q;
21     for (int i=0; i<n; i++)
22         for (int j=0; j<m; j++)
23             if (mat[i][j]=='.') q.push(make_pair(i,j));
24     while (!q.empty())
25     {
26         pair<int , int > now=q.front(); q.pop();
27         int x=now.first,y=now.second;
28         int pos_x,pos_y,cnt;
29         for (int i=0; i<4; i++)
30         {
31             cnt=0;
32             int ok=1;
33             for (int j=0; j<3; j++)
34             {
35                 int xx=x+dir_x[i][j];
36                 int yy=y+dir_y[i][j];
37                 if (xx>=0 && xx<n && yy>=0 && yy<m)
38                 {
39                     if (mat[xx][yy]=='*')
40                     {
41                         pos_x=xx; pos_y=yy;
42                         cnt++;
43                     }
44                 }
45                 else {
46                     ok=0;
47                     break;
48                 }
49             }
50             if (ok && cnt==1)
51             {
52                 mat[pos_x][pos_y]='.';
53                 q.push(make_pair(pos_x,pos_y));
54             }
55         }
56     }
57     return;
58 }
59 
60 void print()
61 {
62     for (int i=0; i<n; i++)
63         puts(mat[i]);
64 }
65 int main()
66 {
67     scanf("%d%d",&n,&m);    
68     for (int i=0; i<n; i++)
69         scanf("%s",mat[i]);
70     bfs();
71     print();
72     return 0;
73 }

 

转载于:https://www.cnblogs.com/ccd2333/p/6371296.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值