您的位置:首页 > 其它

BFS专练1 迷宫打印路径

2018-01-01 17:44 295 查看

Problem Description

有一个m*n格的迷宫(表示有m行、n列),其中有可走的也有不可走的,如果用1表示可以走,0表示不可以走,输入这m*n个数据和起始点、结束点(起始点和结束点都是用两个数据来描述的,分别表示这个点的行号和列号)。现在要你编程找出所有可行的道路,要求所走的路中没有重复的点,走时只能是上下左右四个方向。如果一条路都不可行,则输出相应信息(用-1表示无路)。

Input

第一行是两个数m,n(1< m, n< 15),接下来是m行n列由1和0组成的数据,最后两行是起始点和结束点。

Output

所有可行的路径,输出时按照左上右下的顺序。描述一个点时用(x,y)的形式,除开始点外,其他的都要用“->”表示。如果没有一条可行的路则输出-1。

Example Input

5 4
1 1 0 0
1 1 1 1
0 1 1 0
1 1 0 1
1 1 1 1
1 1
5 4


Example Output

(1,1)->(1,2)->(2,2)->(2,3)->(3,3)->(3,2)->(4,2)->(4,1)->(5,1)->(5,2)->(5,3)->(5,4)

(1,1)->(1,2)->(2,2)->(2,3)->(3,3)->(3,2)->(4,2)->(5,2)->(5,3)->(5,4)

(1,1)->(1,2)->(2,2)->(3,2)->(4,2)->(4,1)->(5,1)->(5,2)->(5,3)->(5,4)

(1,1)->(1,2)->(2,2)->(3,2)->(4,2)->(5,2)->(5,3)->(5,4)

(1,1)->(2,1)->(2,2)->(2,3)->(3,3)->(3,2)->(4,2)->(4,1)->(5,1)->(5,2)->(5,3)->(5,4)

(1,1)->(2,1)->(2,2)->(2,3)->(3,3)->(3,2)->(4,2)->(5,2)->(5,3)->(5,4)

(1,1)->(2,1)->(2,2)->(3,2)->(4,2)->(4,1)->(5,1)->(5,2)->(5,3)->(5,4)

(1,1)->(2,1)->(2,2)->(3,2)->(4,2)->(5,2)->(5,3)->(5,4)
————————————————————————————————————————————————————————————————————
1.思路:1.结构体数组记录路径,判断数组用来记录这个点是否走过,地图数组用来记录地图
              2.注意调用和回溯的关系
              3.注意起始条件,上下左右走怎么表示
2.代码:
#include <stdio.h>
#include<string.h>
struct
{
int x;
int y;

} point[100];//结构体用来记录路径点,也可以用二维数组
int puzzle[16][16];
int answer[16][16];
int xx[4]= {0,-1,0,1};
int yy[4]= {-1,0,1,0};//xx[i]与yy[i]表示上下左右四个方向
int a,b,c,d,sum=0,m,n,step=1;//sum记录路径总和,step记录每条路走几步(作为记录点的标记)
void display()//打印路径函数
{
int y;
for(y=0; y<step; y++)
{
printf("(%d,%d)",point[y].x,point[y].y);
if(y<step-1)
printf("->");
}
printf("\n");
return;
}
void bfs(int k,int p)
{
if(k==c&&p==d)//结束条件:到达该点
{
sum++;
display();
}
int t;
for(t=0; t<4; t++)//四个方向
{
int kx=k+xx[t];
int ky=p+yy[t];//记录
if(kx>=1&&kx<=m&&ky>=1&&ky<=n&&puzzle[kx][ky]==1&&answer[kx][ky]==0)//判断是否合法
{
point[step].x=kx;
point[step].y=ky;//记录路径点
answer[kx][ky]=1;//标记已走过
step++;//步数加一
bfs(kx,ky);//bfs
answer[kx][ky]=0;//回溯变成零
step--;//回溯减一

}
}

}
int main()
{
scanf("%d%d",&m,&n);
int i,j;
memset(puzzle,0,sizeof(puzzle));
for(i=1; i<=m; i++)
{
for(j=1; j<=n; j++)
{
scanf("%d",&puzzle[i][j]);
}
}
scanf("%d%d%d%d",&a,&b,&c,&d);
memset(answer,0,sizeof(answer));
point[0].x=a;
point[0].y=b;//初始化
answer[a][b]=1;//初始化
bfs(a,b);
if(sum==0)
printf("-1\n");//不存在
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: