#include<cstdio>
#include<cstring>
#include<utility>
#include<queue>
#include<map>
#include<algorithm>
using namespace std;

char board[6][6], ma[6][6], tmap[6][6];
int mov[8][2] = {1, 0, 1, -1, 0, -1, -1, -1, -1, 0, -1, 1, 0, 1, 1, 1};
int mark[200];
int n;

struct status
{
    int x, y;
    int ord;
    int te;
    status(int a, int b, int c)
    {
        x = a, y = b, ord = c;
    }
};

pair < int, int > s;
map<pair<int, int>, int > m;

int encode(char(*a)[6])
{
    int bb = 0;
    int va = 1;
    for(int i = 0; i < n; i++)
    {
        for(int j = 0; j < n; j++)
        {
            bb += mark[a[i][j]] * (va);
            va *= 2;
        }
    }
    return bb;
}

void decode(int p, int x, int y)
{
    int cnt = 0;
    while(cnt != n * n)
    {
        int t = p % 2;
        ma[cnt / n][cnt % n] = t == 1 ? '#' : '.';
        p /= 2;
        cnt++;
    }
    ma[x][y] = '@';
}

void construct(int s, int e, int ss, int ee)
{
    memcpy(tmap, ma, sizeof(tmap));
    char newmap[6][6];
    swap(tmap[s][e], tmap[ss][ee]);
    for(int i = 0; i < n; i++)
    {
        for(int j = 0; j < n; j++)
        {
            if(tmap[i][j] == '.')
            {
                int cnt = 0;
                for(int k = 0; k < 8; k++)
                {
                    int tx = i + mov[k][0] , ty = j + mov[k][1];
                    if(tx >= 0 && ty >= 0 && tx < n && ty < n && (tmap[tx][ty] == '#' || tmap[tx][ty] == '@'))
                        cnt++;
                }
                //printf("%d %d %d\n",i,j,cnt);
                if(cnt == 3) newmap[i][j] = '#';
                else newmap[i][j] = tmap[i][j];
            }
            else if(tmap[i][j] == '#')
            {
                int cnt = 0;
                for(int k = 0; k < 8; k++)
                {
                    int tx = i + mov[k][0] , ty = j + mov[k][1];
                    if(tx >= 0 && ty >= 0 && tx < n && ty < n && (tmap[tx][ty] == '#' || tmap[tx][ty] == '@'))
                        cnt++;
                }
                if(cnt == 3 || cnt == 2) newmap[i][j] = '#';
                else newmap[i][j] = '.';
            }
            else newmap[i][j] = tmap[i][j];
        }
    }
    memcpy(tmap, newmap, sizeof(tmap));
}

int bfs()
{
    struct status fir(s.first, s.second, 0);
    fir.te = encode(board);
    queue <struct status> q;
    q.push(fir);
    int flag = -1;
    while(!q.empty())
    {
        struct status vi = q.front();
        if(m[make_pair(vi.te, vi.x * n + vi.y)] == 1)
        {
            q.pop();
        }
        else
        {
            m[make_pair(vi.te, vi.x * n + vi.y)] = 1;
            decode(vi.te, vi.x, vi.y);
            //print(vi.x,vi.y);
            q.pop();
            if(!vi.te) flag = vi.ord;
            if(vi.ord > 10) break;
            if(flag == -1)
            {
                for(int i = 0; i < 8; i++)
                {
                    int tx = vi.x + mov[i][0], ty = vi.y + mov[i][1];
                    if(tx >= 0 && ty >= 0 && tx < n && ty < n && ma[tx][ty] != '#')
                    {
                        construct(vi.x, vi.y, tx, ty);
                        struct status newt(tx, ty, vi.ord + 1);
                        newt.te = encode(tmap);
                        q.push(newt);
                    }
                }
            }
            else break;
        }
    }
    return flag;
}

int main()
{
    mark['#'] = 1, mark['.'] = 0, mark['@'] = 0;
    while(~scanf("%d", &n), n)
    {
        m.clear();
        getchar();
        for(int i = 0; i < n; i++)
        {
            for(int j = 0; j < n; j++)
            {
                scanf("%c", &board[i][j]);
                if(board[i][j] == '@') s = make_pair(i, j);
            }
            getchar();
        }
        printf("%d\n", bfs());
    }
    return 0;
}

Measured memory_bytes: 1572