#include <bits/stdc++.h>
using namespace std;
#define int long long
#define stoi stoll
using ll=long long;
using vi=vector<int>;
using pii=pair<int,int>;
#define ALL(c) begin(c),end(c)
#define RALL(c) rbegin(c),rend(c)
#define ITR(i,b,e) for(auto i=(b);i!=(e);++i)
#define FORE(x,c) for(auto &&x:c)
#define REPF(i,a,n) for(int i=a,i##len=(int)(n);i<i##len;++i)
#define REP(i,n) REPF(i,0,n)
#define REPR(i,n) for(int i=(int)(n);i>=0;--i)
#define SZ(c) ((int)c.size())
#define CONTAIN(c,x) (c.find(x)!=end(c))
#define INSEG(l,x,r) ((l)<=(x)&&(x)<(r))
#define dump(...)
#define pb push_back
#define _ 0
const signed INF_=1001001001; const long long INF=1001001001001001001LL;
const int DX[9]={0,1,0,-1,1,1,-1,-1,0},DY[9]={-1,0,1,0,-1,1,1,-1,0};
template<class T> ostream& operator<<(ostream &os,const vector<T> &v) {
    ITR(i,begin(v),end(v))os<<*i<<(i==end(v)-1?"":" ");return os;}
template<class T> istream& operator>>(istream &is,vector<T> &v) {
    ITR(i,begin(v),end(v)) is>>*i;return is;}
template<class T,class U> istream& operator>>(istream &is, pair<T,U> &p) {
    is>>p.first>>p.second;return is;}
template<class T, class U> bool chmax(T &a,const U &b){return a<b?a=b,1:0;}
template<class T, class U> bool chmin(T &a,const U &b){return a>b?a=b,1:0;}
template <class T> void PSUM(T& c) {partial_sum(begin(c), end(c), begin(c));}
template<class T> using heap=priority_queue<T,vector<T>,greater<T>>;
struct before_main_function {
    before_main_function() {
        cin.tie(0); ios::sync_with_stdio(false);
        cout << setprecision(15) << fixed;
        // #define endl "\n"
    }
} before_main_function;
//------------------8<------------------------------------8<--------------------

signed main() {
    while (1) {
        int n;
        cin >> n;
        if (n == 0) break;

        auto get = [&](int S, int y, int x) -> int {
            return (S >> (y * n + x)) & 1;
        };

        int ST = 0;
        REP(i, n) {
            string s;
            cin >> s;
            REP(j, n) {
                if (s[j] == '@') {
                    ST |= (i * n + j) << (n * n);
                }
                if (s[j] == '#') {
                    ST |= 1 << (i * n + j);
                }
            }
        }
        
        int dy[8] = {-1, 0, 1, 0, -1, 1, 1, -1};
        int dx[8] = {0, 1, 0, -1, 1, 1, -1, -1};
        auto next = [&](int s, int t) -> int {
            int ret = 0;
            REP(i, n) {
                REP(j, n) {
                    if (i * n + j == t) continue;

                    int cnt = 0;
                    REP(d, 8) {
                        int ii = i + dy[d];
                        int jj = j + dx[d];
                        if (ii < 0 || ii >= n || jj < 0 || jj >= n) continue;
                        cnt += get(s, ii, jj) | (ii * n + jj == t);
                    }
                    int nxt = 0;
                    if (get(s, i, j)) {
                        if (cnt == 2 || cnt == 3) {
                            nxt = 1;
                        }
                    } else {
                        if (cnt == 3) {
                            nxt = 1;
                        }
                    }
                    ret |= nxt << (i * n + j);
                }
            }
            return ret;
        };
        
        int ans = -1;
        map<int, int> dist;
        queue<int> q;
        dist[ST] = 0;
        q.push(ST);
        while (!q.empty()) {
            int st = q.front(); q.pop();
            int s = st & ((1 << (n * n)) - 1), t = st >> (n * n);
            int y = t / n;
            int x = t % n;

            if (s == 0) {
                ans = dist[st];
                break;
            }

            REP(dir, 8) {
                int yy = y + dy[dir];
                int xx = x + dx[dir];
                if (yy < 0 || yy >= n || xx < 0 || xx >= n) continue;
                if (get(s, yy, xx)) continue;
                int nt = yy * n + xx;
                int nst = (nt << (n * n)) | next(s, nt);
                if (dist.find(nst) == dist.end()) {
                    dist[nst] = dist[st] + 1;
                    q.push(nst);
                }
            }
        }
        cout << ans << endl;
    }
}



Measured memory_bytes: 4340