#include <stdio.h>
#define MAX 101
#define LEFT 0
#define RIGHT 2
#define BOTTOM 3
int Arr[MAX][MAX];
int Visited[MAX][MAX];
int Num;
//왼쪽, 위쪽, 오른쪽, 아래쪽
int dx[4] = { -1, 0, 1, 0 };
int dy[4] = { 0, -1, 0, 1 };
int MinCnt;
//int Cnt;
int result;
void input()
{
int i, j;
MinCnt = 9999;
scanf("%d", &Num);
for (i = 1; i < MAX; i++)
{
for (j = 1; j < MAX; j++)
{
scanf("%d", &Arr[i][j]);
Visited[i][j] = 0;
}
}
}
//Check함수에서는 양 옆에 길이 있는지 확인한다.
//왼쪽, 오른쪽 둘다 길이 없으면 아래로 간다.
//왼쪽과 오른쪽에 우선순위를 둔다.
int CheckFun(int y, int x, int start)
{
if (y + dy[LEFT] > 0 && y + dy[LEFT] < MAX &&
x + dx[LEFT] > 0 && x + dx[LEFT] < MAX
&& Arr[y + dy[LEFT]][x + dx[LEFT]] == 1
&& Visited[y + dy[LEFT]][x + dx[LEFT]] == 0)
return LEFT;
else if (y + dy[RIGHT] > 0 && y + dy[RIGHT] < MAX &&
x + dx[RIGHT] > 0 && x + dx[RIGHT] < MAX
&& Arr[y + dy[RIGHT]][x + dx[RIGHT]] == 1
&& Visited[y + dy[RIGHT]][x + dx[RIGHT]] == 0)
return RIGHT;
else
return BOTTOM;
}
void process(int y, int x, int start, int Cnt)
{
//종료 조건
if (y == MAX - 1)
{
if (MinCnt > Cnt)
{
result = start;
MinCnt = Cnt;
}
return;
}
//현재 갈 수 있는 길이 왼쪽인 경우, Visited Check 한 후 재귀 호출
if (CheckFun(y, x, start) == LEFT)
{
Visited[y + dy[LEFT]][x + dx[LEFT]] = 1;
process(y + dy[LEFT], x + dx[LEFT], start, ++Cnt);
}
else if (CheckFun(y, x, start) == RIGHT)
{
Visited[y + dy[RIGHT]][x + dx[RIGHT]] = 1;
process(y + dy[RIGHT], x + dx[RIGHT], start, ++Cnt);
}
else if (CheckFun(y, x, start) == BOTTOM)
{
Visited[y + dy[BOTTOM]][x + dx[BOTTOM]] = 1;
process(y + dy[BOTTOM], x + dx[BOTTOM], start, ++Cnt);
}
}
void output()
{
printf("#%d %d\n", Num, result - 1);
}
int main(void)
{
freopen("input.txt", "r", stdin);
freopen("output.txt", "w", stdout);
int TC = 10;
int start = 0;
int i, j;
while (TC--)
{
input();
//가장 윗줄이 1인 지점이 출발지점
for (start = 1; start < MAX; start++)
{
if (Arr[1][start])
{
for (i = 1; i < MAX; i++)
{
for (j = 1; j < MAX; j++)
{
Visited[i][j] = 0;
}
}
Visited[1][start] = 1;
process(1, start, start, 0);
}
}
output();
}
return 0;
}