对图广搜,当当前点的一个脚中的通路大于2个,就把他全染成通路,新的通路加入队列。。
#include <iostream> #include <queue> #include <stack> #include <map> #include <set> #include <bitset> #include <cstdio> #include <algorithm> #include <cstring> #include <climits> #include <cstdlib> #include <cmath> #include <time.h> #define maxn 2005 #define maxm 300005 #define eps 1e-3 #define mod 9999677 #define INF 0x3f3f3f3f #define PI (acos(-1.0)) #define lowbit(x) (x&(-x)) #define mp make_pair #define ls o<<1 #define rs o<<1 | 1 #define lson o<<1, L, mid #define rson o<<1 | 1, mid+1, R #define pii pair<int, int> #pragma comment(linker, "/STACK:16777216") typedef long long LL; typedef unsigned long long ULL; using namespace std; LL qpow(LL a, LL b){LL res=1,base=a;while(b){if(b%2)res=res*base;base=base*base;b/=2;}return res;} LL powmod(LL a, LL b){LL res=1,base=a;while(b){if(b%2)res=res*base%mod;base=base*base%mod;b/=2;}return res;} //head queue<pair<int, int> > q; char g[maxn][maxn]; int vis[maxn][maxn]; int dir[4][2] = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}}; int n, m; void read() { memset(g, '*', sizeof g); scanf("%d%d", &n, &m); for(int i = 1; i <= n; i++) scanf("%s", g[i]+1); } void bfs() { while(!q.empty()) { int x = q.front().first, y = q.front().second; q.pop(); //int t = g[x][y+1] == '.' + g[x-1][y] == '.' + g[x-1][y+1] == '.'; for(int i = 0; i < 4; i++) { int x1, y1, x2, y2, x3, y3; if(i == 0) x1 = x, y1 = y+1, x2 = x-1, y2 = y, x3 = x-1, y3 = y+1; if(i == 1) x1 = x, y1 = y+1, x2 = x+1, y2 = y, x3 = x+1, y3 = y+1; if(i == 2) x1 = x, y1 = y-1, x2 = x+1, y2 = y, x3 = x+1, y3 = y-1; if(i == 3) x1 = x, y1 = y-1, x2 = x-1, y2 = y, x3 = x-1, y3 = y-1; int t = (g[x1][y1] == '.') + (g[x2][y2] == '.') + (g[x3][y3] == '.'); // if(x == 2 && y == 2 && i == 1) printf("AA %d\n", t); if(t >= 2) { if(!vis[x1][y1] && g[x1][y1] == '*') g[x1][y1] = '.', vis[x1][y1] = true, q.push(mp(x1, y1)); if(!vis[x2][y2] && g[x2][y2] == '*') g[x2][y2] = '.', vis[x2][y2] = true, q.push(mp(x2, y2)); if(!vis[x3][y3] && g[x3][y3] == '*') g[x3][y3] = '.', vis[x3][y3] = true, q.push(mp(x3, y3)); } } } } void work() { for(int i = 1; i <= n; i++) for(int j = 1; j <= m; j++) if(g[i][j] == '.') vis[i][j] = true, q.push(mp(i, j)); bfs(); for(int i = 1; i <= n; i++) puts(g[i]+1); } int main() { read(); work(); return 0; }