#include<cstdio>
#include<cstring>
#include<utility>
#include<queue>
#include<set>
#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;
set<int> ss;
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;

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 printt()
{
    printf("-------\n");
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<n;j++)
        {
            printf("%c ",tmap[i][j]);
        }
        printf("\n");
    }
    printf("-------\n");
}

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++)
        {
            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(tmap[i][j] == '.')
            {
                if(cnt == 3) newmap[i][j] = '#';
                else newmap[i][j] = tmap[i][j];
            }
            else if(tmap[i][j] == '#')
            {
                if(cnt == 3 || cnt == 2) newmap[i][j]='#';
                else newmap[i][j] = '.';
            }
            else newmap[i][j] = tmap[i][j];
        }
    }
    memcpy(tmap,newmap,sizeof(tmap));
}

void print(int x,int y)
{
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<n;j++)
        {
            printf("%c ",ma[i][j]);
        }
        printf("\n");
    }
    printf("\n");
}

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();
         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);
                     //if(ss.count(newt.te)) flag = -1;
                     //else ss.insert(newt.te);
                     q.push(newt);
                 }
             }
         }
         else break;
     }
     return flag;
}

int main()
{
    mark['#'] = 1, mark['.'] = 0, mark['@'] = 0;
    while(~scanf("%d",&n),n)
    {
        ss.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: 14544