// 2009アジア地区予選 J : Infected Land #include #include #include #include #include #include using namespace std; char dx[] = {-1,-1,-1,0,1,1,1,0}; char dy[] = {-1,0,1,1,1,0,-1,-1}; class Node{ public: int land, x, y; Node(int land, int x, int y) : land(land), x(x), y(y) {} bool operator < (const Node &n) const { return make_pair(land,make_pair(x,y)) < make_pair(n.land,make_pair(n.x,n.y)); } }; int main(){ ifstream fin("J.in"); int n; string s[5]; while(fin >> n, n){ for(int i=0;i> s[i]; int sx, sy; for(int i=0;i=0;i--) for(int j=n-1;j>=0;j--) land = 2*land + (s[i][j]=='#'); int ans = -1; set mem; mem.insert(Node(land, sx, sy)); queue< pair > qu; qu.push(make_pair(Node(land,sx,sy),0)); while(!qu.empty()){ pair p = qu.front(); qu.pop(); int L = p.first.land, x = p.first.x, y = p.first.y, cost = p.second; if(L==0){ ans = cost; break; } for(int dir=0;dir<8;dir++){ int nx = x+dx[dir], ny = y+dy[dir]; if(nx<0||n<=nx||ny<0||n<=ny||(L>>(nx*n+ny))&1) continue; int nL = 0; for(int i=n-1;i>=0;i--){ for(int j=n-1;j>=0;j--){ if(i==nx&&j==ny) continue; int cnt = 0; for(int k=0;k<8;k++){ int ni = i+dx[k], nj = j+dy[k]; if(ni<0||n<=ni||nj<0||n<=nj) continue; if(ni==nx&&nj==ny) cnt++; else cnt += (L>>(ni*n+nj))&1; } if((L>>(i*n+j))&1){ if(cnt==2||cnt==3) nL |= 1<<(i*n+j); } else { if(cnt==3) nL |= 1<<(i*n+j); } } } if(mem.find(Node(nL,nx,ny))==mem.end()){ mem.insert(Node(nL,nx,ny)); qu.push(make_pair(Node(nL,nx,ny),cost+1)); } } } cout << ans << endl; } }