#include <bits/stdc++.h>
using namespace std;
int n;

bool onmp(int x,int y){return x>=0&&y>=0&&x<n&&y<n;}

bool check(const vector<string> &A){
  for(int i=0;i<n;i++)
    for(int j=0;j<n;j++)if(A[i][j]=='#')return 0;
  return 1;
}

int count(int x,int y,const vector<string> &A){
  int res=0;  
  for(int i=-1;i<=1;i++)
    for(int j=-1;j<=1;j++){
      int nx = x+i,ny = y+j;
      if((i||j)&&onmp(nx,ny))res += A[ny][nx]!='.';
    }
  return res;
}

vector<string> mkmp(const vector<string> &A){
  vector<string> res=A;
  for(int i=0;i<n;i++)
    for(int j=0;j<n;j++){
      int cnt = count(j,i,A);
      if(A[i][j]=='#')res[i][j]=(cnt==2||cnt==3)? '#':'.';
      if(A[i][j]=='.')res[i][j]=(cnt==3)? '#':'.';
      if(A[i][j]=='@')res[i][j]='@';
    }
  return res;
}


void getPos(vector<string>&A,int &x,int &y){
  for(int i=0;i<n&&x==-1;i++)
    for(int j=0;j<n&&x==-1;j++) if(A[i][j]=='@')x=j,y=i;
}



int bfs(vector<string>start){
  queue<vector<string> > Q;
  map<vector<string>,int>D;
  Q.push(start);
  D[start]=0;

  while(!Q.empty()){
    vector<string> A=Q.front();Q.pop();
    int cost = D[A];
    int x = -1,y=-1;
    getPos(A,x,y);
    if(check(A))return cost;
    if(cost>=10)continue;

    A[y][x] = '.';
    for(int dy=-1;dy<=1;dy++)
      for(int dx=-1;dx<=1;dx++){
	int nx = x+dx,ny = y+dy;
	if((!dx&&!dy)||!onmp(nx,ny)||A[ny][nx]=='#')continue;
	A[ny][nx] = '@';
	vector<string> nA = mkmp(A);
	if(!D.count(nA))Q.push(nA),D[nA] = cost+1;
	A[ny][nx] = '.';
      }
  }
  return -1;
}

int main(){
  while(cin>>n,n){
    vector<string> mp(n);
    for(int i=0;i<n;i++)cin>>mp[i];
    cout<<bfs(mp)<<endl;
  }
  return 0;
}