#include<stdio.h>
#include<stdlib.h>
/*
5 6
0 1 0 0 0 1
0 0 0 1 0 0
1 0 1 0 0 1
1 0 0 1 0 1
1 1 0 0 0 0
1 1 4 5
*/
int book[50][50],a[50][50],m,n;
int mi[1000],ni[1000];
int p,q,min=99999999; //p,q分别表示终点的横纵坐标
int sum=1;
void dfs(int x,int y,int step,int M)
{
//定义方向,分别表示右下左上
int next[4][2]={{0,1},{1,0},{0,-1},{-1,0}};
int tx,ty,k;
if(x==p&&y==q) //到达终点
{
if(step<min){
min=step; //更新步数
for(int i=0;i<2*min;i++){
ni[i]=mi[i];
}
}
printf("第%d种方法为 ",sum++);
for(int i=0;i<2*step;i+=2){
printf("(%d,%d) ",mi[i],mi[i+1]);
}
printf("\n");
return ;
}
//枚举四种走法
for(k=0;k<=3;k++)
{
//计算下一个点的坐标
tx=x+next[k][0];
ty=y+next[k][1];
//检查是否越界
if(tx<1||tx>m||ty<1||ty>n)
continue;
//判断该点是否是障碍物或者是否在路径中
if(book[tx][ty]==0&&a[tx][ty]==0) //如果不在路中并且不是障碍物
{ mi[M]=tx,mi[M+1]=ty;
book[tx][ty]=1;
dfs(tx,ty,step+1,M+2);
book[tx][ty]=0;
}
}
return ;
}
int main()
{
int start_x,start_y;
scanf("%d%d",&m,&n);
//构造迷宫
for(int i=1;i<=m;i++)
{
for(int j=1;j<=n;j++)
{
scanf("%d",&a[i][j]);
}
}
//输入起点和终点
scanf("%d%d%d%d",&start_x,&start_y,&p,&q);
//从起点开始搜索
book[start_x][start_y]=1; //标识起点在路径中防止后面重走
//调用函数
dfs(start_x,start_y,0,0); //起始的x,y点以及初始的步数
//打印最短步数
printf("%d\n",min);
for(int i=0;i<2*min;i+=2)
printf("(%d,%d) ",ni[i],ni[i+1]);
return 0;
}