#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using vi = vector<int>;
using vvi = vector<vi>;
using vll = vector<ll>;
using vvll = vector<vll>;
using P = pair<int, int>;
const double eps = 1e-8;
const ll MOD = 1000000007;
const int INF = INT_MAX / 2;
const ll LINF = LLONG_MAX / 2;
template<typename T1, typename T2>
void chmax(T1 &a, const T2 &b) {
  if (a < b) a = b;
}
template<typename T1, typename T2>
void chmin(T1 &a, const T2 &b) {
  if (a > b) a = b;
}
template<typename T>
void printv(const vector<T> &s) {
  for (int i = 0; i < (int) (s.size()); ++i) {
    cout << s[i];
    if (i != (int) (s.size()) - 1) cout << " ";
  }
  cout << "\n";
}
template<typename T1, typename T2>
ostream &operator<<(ostream &os, const pair<T1, T2> p) {
  os << p.first << ":" << p.second;
  return os;
}
struct RollingHash {
  const int base = 9973;
  const int mod[2] = {999999937, 1000000007};
  vector<int> s;
  vector<ll> hash[2], pow[2];
  template<class S>
  RollingHash(const S &s) {
    int n = s.size();
    for (int id = 0; id < 2; ++id) {
      hash[id].assign(n+1, 0);
      pow[id].assign(n+1, 1);
      for (int i = 0; i < n; ++i) {
        hash[id][i+1] = (hash[id][i] * base + s[i]) % mod[id];
        pow[id][i+1] = pow[id][i] * base % mod[id];
      }
    }
  }
  pair<ll,ll> get(int l, int r) {
    ll ret[2];
    for (int id = 0; id < 2; ++id) {
      ret[id] = hash[id][r] - hash[id][l] * pow[id][r - l] % mod[id];
      if (ret[id] < 0) ret[id] += mod[id];
    }
    return { ret[0], ret[1] };
  }
};
struct Elm {
  int d, r, c;
  ll hash;
  vector<string> v;
};
bool operator<(const Elm &e1, const Elm &e2) {
  return e1.d > e2.d;
}
bool solve() {
  int n;
  cin >> n;
  if (n == 0) return false;
  vector<string> in(n);
  int r = -1, c = -1;
  int cnt = 0;
  for(int i=0;i<n;++i) {
    cin >> in[i];
    for(int j=0;j<n;++j) {
      if (in[i][j] == '@') r = i, c = j;
      cnt += in[i][j] == '#';
    }
  }
  if(cnt == 0) {
    cout << 0 << endl;
    return true;
  }
  map<ll, int> mp;
  queue<Elm> pq;
  ll hash = 0;
  ll now = 1;
  for(int i=0;i<n;++i) {
    for(int j=0;j<n;++j) {
      hash += now * in[i][j];
      hash %= MOD;
      now *= 998244353;
      now %= MOD;
    }
  }
  mp[hash] = 0;
  pq.push({0, r, c, hash, in});
  vi dr = {-1, 1, 0, 0}, dc = {0, 0, -1, 1};
  vi dr2 = {1, 1, 0, -1, -1, -1, 0, 1}, dc2 = {0, -1, -1, -1, 0, 1, 1, 1};
  ll ans = -1;
  while (!pq.empty()) {
    auto now = pq.front();
    pq.pop();
    int d = now.d, r = now.r, c = now.c;
    ll hash = now.hash;
    auto v = now.v;
    if (mp.find(hash) != mp.end() && mp[hash] < d) continue;
    for(int i=0;i<8;++i) {
      if(ans != -1) break;
      vector<string> nxt(n);
      for(int j=0;j<n;++j) {
        nxt[j].assign(n, '.');
      }
      int nr = r + dr2[i], nc = c + dc2[i];
      if (!(0 <= nr && nr < n && 0 <= nc && nc < n) || v[nr][nc] == '#') continue;
      nxt[nr][nc] = '@';
      int cnt_sharp = 0;
      for(int j=0;j<n;++j) {
        for(int k=0;k<n;++k) {
          int cnt = 0;
          for(int l=0;l<8;++l) {
            int adjr = j + dr2[l], adjc = k + dc2[l];
            if (0 <= adjr && adjr < n && 0 <= adjc && adjc < n) {
              cnt += v[adjr][adjc] == '#' || nxt[adjr][adjc] == '@';
            }
          }
          if ((v[j][k] == '#' && (cnt == 2 || cnt == 3)) ||
              ((v[j][k] == '.' || v[j][k] == '@') && nxt[j][k] != '@' && cnt == 3)) {
            nxt[j][k] = '#';
            cnt_sharp++;
          }
        }
      }
      ll nxthash = 0;
      ll nowmul = 1;
      for(int i=0;i<n;++i) {
        for(int j=0;j<n;++j) {
          nxthash += nowmul * nxt[i][j];
          nxthash %= MOD;
          nowmul *= 998244353;
          nowmul %= MOD;
        }
      }
      if (mp.find(nxthash) == mp.end() || mp[nxthash] > d + 1) {
        if(cnt_sharp == 0) {
          ans = d+1;
          break;
        }
        mp[nxthash] = d + 1;
        pq.push({d + 1, nr, nc, nxthash, nxt});
      }
    }
  }
  cout << (ans == LINF ? -1 : ans) << endl;
  return true;
}
int main() {
  cin.tie(0);
  ios::sync_with_stdio(false);
  cout << fixed << setprecision(10);
  while (1) {
    if (!solve()) break;
  }
}



Measured memory_bytes: 4536