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; }
相关文章推荐
- POJ-3984-迷宫问题(BFS打印路径)
- bfs 较为全面的迷宫路径问题,包括路径的打印,起点到任一点的最小步数.
- 迷宫BFS+递归回溯找爹打印路径
- BFS之最简单的迷宫问题(并打印路径)
- poj3984 迷宫问题 简单bfs打印路径
- POJ 3984 迷宫问题(BFS+打印路径)
- poj 3984 迷宫问题(bfs 打印路径)
- 迷宫问题:利用BFS打印出从起点到终点的路径(java版)
- POJ ~ 3984 ~ 迷宫问题 (BFS+打印路径)
- bfs迷宫问题--打印路径
- POJ 3984 迷宫问题(bfs+打印路径)
- BFS(最短路+路径打印) POJ 3984 迷宫问题
- poj 3984迷宫问题(bfs加打印路径)
- POJ 3984 迷宫问题【bfs路径打印】
- BFS解迷宫问题,并打印最短路径
- 迷宫问题bfs+打印路径
- hdu1728逃离迷宫 (利用最短路径思想+优先队列(BFS))
- 迷宫最短路径长度bfs
- 迷宫-最短路径距离-BFS
- bfs实现迷宫路径最小