#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
#define MAX_N 6
const int INF = 0x3f3f3f3f;
int maze[MAX_N][MAX_N];
bool vis[MAX_N][MAX_N];
int d[MAX_N][MAX_N];
struct node
{
int x, y;
};
node pre[MAX_N][MAX_N];
int mov[4][2] =
{
0, 1,
0, -1,
1, 0,
-1, 0
};
void print_ans(node p)
{
vector v;
while(d[p.x][p.y] != 0)
{
v.push_back(p);
p = pre[p.x][p.y];
}
node u;
u.x = 0;
u.y = 0;
v.push_back(u);
for(int i = v.size() -1; i >= 0 ; i--)
{
printf("(%d, %d)\n", v[i].x, v[i].y);
}
return;
}
void bfs(int sx, int sy)
{
memset(d, 1, sizeof(d));
queue que;
vis[sx][sy] = true;
d[sx][sy] = 0;
node u;
u.x = sx;
u.y = sy;
que.push(u);
while(!que.empty())
{
node p = que.front();
que.pop();
if(p.x == 4 && p.y == 4 )
{
print_ans(p);
return;
}
for(int i = 0 ; i < 4 ; i++)
{
int nx = p.x + mov[i][0];
int ny = p.y + mov[i][1];
if(!vis[nx][ny] && nx >= 0 && ny >= 0 && nx <= 4 && ny <= 4 && maze[nx][ny] == 0)
{
vis[nx][ny] = true;
pre[nx][ny] = p;
node v;
v.x = nx;
v.y = ny;
que.push(v);
}
}
}
}
int main()
{
for(int i = 0 ; i < 5 ; i++)
{
for(int j = 0 ; j < 5 ; j++)
{
scanf("%d", &maze[i][j]);
}
}
bfs(0, 0);
return 0;
}