//该题主要是学会任何在广搜的过程中,记录下最短的那条路径
//方法:队列中的任何一个节点的前驱节点唯一,利用这一点,记录下前驱节点并深搜输出
#include<iostream>
#include<queue>
using namespace std;
//定义节点
struct Node
{
int value;
int x,y;
int pre_x,pre_y;//前驱节点。因为后继节点可能多个,但前驱节点唯一
bool sign;
}node[5][5];
//定义队列
queue<Node>Q;
//定义四个方向的想,x和y的变化
int go_x[4]={-1,0,1,0};
int go_y[4]={0,1,0,-1};
//判断是否在图内
bool IsIn(int x,int y)
{
if(x<0||x>4||y<0||y>4) return false;
else return true;
}
//广搜,搜索最短路
void bfs()
{
int now_x,now_y,i,tx,ty;
now_x=Q.front().x,now_y=Q.front().y;
for(i=0;i<4;i++)
{
tx=now_x+go_x[i],ty=now_y+go_y[i];
if(IsIn(tx,ty) && !node[tx][ty].sign && node[tx][ty].value!=1)
{
node[tx][ty].pre_x=now_x;
node[tx][ty].pre_y=now_y;
node[tx][ty].sign=true;
Q.push(node[tx][ty]);
}
}
Q.pop();
while(!Q.empty())
{
now_x=Q.front().x,now_y=Q.front().y;
if(now_x==4 && now_y==4) return;//如果已经到达重点则返回
for(i=0;i<4;i++)
{
tx=now_x+go_x[i],ty=now_y+go_y[i];
if(IsIn(tx,ty) && !node[tx][ty].sign && node[tx][ty].value!=1)
{
node[tx][ty].pre_x=now_x;
node[tx][ty].pre_y=now_y;
node[tx][ty].sign=true;
Q.push(node[tx][ty]);
}
}
Q.pop();
}
}
//深搜,搜索一路走来的路径
void dfs(int x,int y)
{
int pre_x=node[x][y].pre_x;
int pre_y=node[x][y].pre_y;
//如果有祖先,则搜索祖先
if(pre_x!=-1 && pre_y!=-1)
dfs(pre_x,pre_y);
//输出自己的地址,无论是否有祖先(队列中无祖先的只有【0】【0】点)
printf("(%d, %d)\n",x,y);
}
int main()
{
int i,j;
while(cin>>node[0][0].value)
{
//读入数据
for(i=1;i<5;i++)
cin>>node[0][i].value;
for(i=1;i<5;i++)
{
for(j=0;j<5;j++)
cin>>node[i][j].value;
}
//初始化节点的其他数据
for(i=0;i<5;i++)
{
for(j=0;j<5;j++)
{
node[i][j].pre_x=node[i][j].pre_y=-1;
node[i][j].x=i;
node[i][j].y=j;
node[i][j].sign=false;
}
}
//清空队列
while(!Q.empty())
Q.pop();
node[0][0].sign=true;
Q.push(node[0][0]);
// 搜索最短路径
bfs();
// 输出路径
dfs(4,4);
}
return 0;
}