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

using VI = vector<int>;
using VVI = vector<VI>;
using PII = pair<int, int>;
using LL = long long;
using VL = vector<LL>;
using VVL = vector<VL>;
using PLL = pair<LL, LL>;
using VS = vector<string>;

#define ALL(a)  begin((a)),end((a))
#define RALL(a) (a).rbegin(), (a).rend()
#define PB push_back
#define EB emplace_back
#define MP make_pair
#define SZ(a) int((a).size())
#define SORT(c) sort(ALL((c)))
#define RSORT(c) sort(RALL((c)))
#define UNIQ(c) (c).erase(unique(ALL((c))), end((c)))

#define FOR(i,a,b) for(int i=(a);i<(b);++i)
#define REP(i,n)  FOR(i,0,n)

#define FF first
#define SS second
template<class S, class T>
istream& operator>>(istream& is, pair<S,T>& p){
  return is >> p.FF >> p.SS;
}
template<class S, class T>
ostream& operator<<(ostream& os, const pair<S,T>& p){
  return os << p.FF << " " << p.SS;
}
template<class T>
void maxi(T& x, T y){
  if(x < y) x = y;
}
template<class T>
void mini(T& x, T y){
  if(x > y) x = y;
}


const double EPS = 1e-10;
const double PI  = acos(-1.0);
const LL MOD = 1e9+7;

int dx[] = {1,1,0,-1,-1,-1,0,1};
int dy[] = {0,1,1,1,0,-1,-1,-1};

int N;
int T[1<<25];
int trans(int b, int p){
  b |= 1<<p;
  VVI cnt(N, VI(N));
  REP(y,N) REP(x,N){
	int i = y*N + x;
	if(b>>i&1){
	  REP(d,8){
		int tx = x + dx[d];
		int ty = y + dy[d];
		if(0 <= tx && tx < N && 0 <= ty && ty < N)
		  cnt[ty][tx]++;
	  }
	}
  }
  int res = 0;
  REP(y,N) REP(x,N){
	int i = y*N+x;
	if(p == i) continue;
	if(b>>i&1){
	  res |= (cnt[y][x]==2 || cnt[y][x]==3? 1 : 0) << i;
	}
	else{
	  res |= (cnt[y][x]==3? 1 : 0) << i;
	}
  }
  return res;
}

int solve(int b, int p){
  queue<int> q;
  map<int,int> dist;
  q.push(b|(p<<25));
  dist[b|(p<<25)] = 0;

  while(!q.empty()){
	int bp = q.front();
	q.pop();
	int b = bp & ((1<<25)-1);
	if(b == 0){
	  return dist[bp];
	}
	int p = bp >> 25;
	int x = p % N, y = p / N;
	REP(d,8){
	  int tx = x + dx[d];
	  int ty = y + dy[d];
	  int np = ty*N + tx;
	  if(!(0 <= tx && tx < N && 0 <= ty && ty < N) || (b>>np&1)) continue;
	  int nb = trans(b, np);
	  int nbp = nb | (np<<25);
	  if(!dist.count(nbp)){
		dist[nbp] = dist[bp] + 1;
		q.push(nbp);
	  }
	}
  }
  return -1;
}

void print(int x){
  REP(y,N){
	cout << bitset<3>(x&((1<<N)-1)) << endl;
	x >>= N;
  }
}

int main(){
  cin.tie(0);
  ios_base::sync_with_stdio(false);

  while(cin>>N,N){
	int b = 0, p = 0;
	REP(y,N){
	  string s;
	  cin >> s;
	  REP(x,N)
		if(s[x] == '@')
		  p = y*N+x;
		else if(s[x] == '#')
		  b |= 1 << (y*N+x);
	}

	int res = solve(b, p);
	cout << res << endl;
  }
  
  return 0;
}