#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; }