#include<cstdio> #include<set> using namespace std; char t[3005][3005]; int n; bool ok(int x, int y){ return (0<=x && x<n && 0<=y && y<n && t[x][y]=='.'); } int wyn=0; void licz(set<pair<int,int> > r, int m){ if(m<=0){ wyn++; return; } set<pair<int,int> > rec; while(!r.empty()){ int i=r.begin()->first; int j=r.begin()->second; rec.insert(make_pair(i,j)); r.erase(r.begin()); if(ok(i,j)){ set<pair<int,int> > s=r; t[i][j]='#'; s.erase(make_pair(i,j)); if(t[i][j]=='#'){ if(ok(i-1,j)) s.insert(make_pair(i-1,j)); if(ok(i+1,j)) s.insert(make_pair(i+1,j)); if(ok(i,j-1)) s.insert(make_pair(i,j-1)); if(ok(i,j+1)) s.insert(make_pair(i,j+1)); } licz(s,m-1); } } while(!rec.empty()){ int i=rec.begin()->first; int j=rec.begin()->second; t[i][j]='.'; rec.erase(rec.begin()); } return; } int main(void){ int m; scanf("%d%d",&n,&m); for(int i=0;i<n;i++) scanf("%s",t[i]); set<pair<int,int> > s; for(int i=0;i<n;i++) for(int j=0;j<n;j++) if(t[i][j]=='#'){ if(ok(i-1,j)) s.insert(make_pair(i-1,j)); if(ok(i+1,j)) s.insert(make_pair(i+1,j)); if(ok(i,j-1)) s.insert(make_pair(i,j-1)); if(ok(i,j+1)) s.insert(make_pair(i,j+1)); } licz(s,m); printf("%d\n",wyn); return 0; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 | #include<cstdio> #include<set> using namespace std; char t[3005][3005]; int n; bool ok(int x, int y){ return (0<=x && x<n && 0<=y && y<n && t[x][y]=='.'); } int wyn=0; void licz(set<pair<int,int> > r, int m){ if(m<=0){ wyn++; return; } set<pair<int,int> > rec; while(!r.empty()){ int i=r.begin()->first; int j=r.begin()->second; rec.insert(make_pair(i,j)); r.erase(r.begin()); if(ok(i,j)){ set<pair<int,int> > s=r; t[i][j]='#'; s.erase(make_pair(i,j)); if(t[i][j]=='#'){ if(ok(i-1,j)) s.insert(make_pair(i-1,j)); if(ok(i+1,j)) s.insert(make_pair(i+1,j)); if(ok(i,j-1)) s.insert(make_pair(i,j-1)); if(ok(i,j+1)) s.insert(make_pair(i,j+1)); } licz(s,m-1); } } while(!rec.empty()){ int i=rec.begin()->first; int j=rec.begin()->second; t[i][j]='.'; rec.erase(rec.begin()); } return; } int main(void){ int m; scanf("%d%d",&n,&m); for(int i=0;i<n;i++) scanf("%s",t[i]); set<pair<int,int> > s; for(int i=0;i<n;i++) for(int j=0;j<n;j++) if(t[i][j]=='#'){ if(ok(i-1,j)) s.insert(make_pair(i-1,j)); if(ok(i+1,j)) s.insert(make_pair(i+1,j)); if(ok(i,j-1)) s.insert(make_pair(i,j-1)); if(ok(i,j+1)) s.insert(make_pair(i,j+1)); } licz(s,m); printf("%d\n",wyn); return 0; } |