#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; } |
English