迷宫问题 dfs bfs

来源:互联网 发布:服装收银软件 编辑:程序博客网 时间:2024/05/16 23:01

从迷宫入口点(1,1)出发,出口点(m,n);

1.求所有路径条数

2.求最短路径条数

3.输出一条最短路径

题解:向四周搜索,记下所有一步能到达的坐标点;然后依次再从这些点出发,再记下所有一步能到达的坐标点,…,依此类推,直到到达迷宫的出口点(m,n)为止,然后从出口点沿搜索路径回溯直至入口。这样就找到了一条迷宫的最短路径,否则迷宫无路径。

bfs求2,3

#include<stdio.h>#define m 5#define n 5struct point{int x;int y;int pre;int len;}Q[5005];int ans=0;int a[8][2]={{-1,0},{-1,1},{0,1},{1,1},{1,0},{1,-1},{0,-1},{-1,-1}};int f[m+2][n+2]={1,1,1,1,1,1,1,//0可以过                  1,0,0,0,1,0,1,                 1,0,1,0,0,0,1,                 1,0,0,1,0,1,1,                 1,1,1,0,1,0,1,                 1,0,1,1,1,0,1,                 1,1,1,1,1,1,1};void Out(int k){//输出一条最短路径while(Q[k].pre>0){printf("(%d,%d)<--",Q[k].x,Q[k].y);k=Q[k].pre;}printf("(%d,%d)",Q[1].x,Q[1].y);}void bfs(){int i,j,k=1,top=1,x1,y1,find=0;Q[k].x=1;//始点入队列 Q[k].y=1;Q[k].pre=0;Q[k].len=0;f[1][1]=-1;while(top<=k && !find){for(i=0;i<8;i++){x1=Q[top].x+a[i][0];y1=Q[top].y+a[i][1];if(f[x1][y1]==0){k++;Q[k].x=x1;//入队列Q[k].y=y1;Q[k].pre=top;Q[k].len=Q[top].len+1;f[x1][y1]=-1;//避免重复搜索 }if((x1==m) && (y1==n)){find=1;printf("%d\n",Q[k].len);//输出最短路径长度 Out(k);//输出一条最短路径break;}}top++;}if(find==0){printf("NO path\n");}}int main(){bfs();return 0;} 
dfs求1

#include<stdio.h>#define m 5#define n 5struct point{int x;int y;int pre;}Q[5005];int ans=0;int a[8][2]={{-1,0},{-1,1},{0,1},{1,1},{1,0},{1,-1},{0,-1},{-1,-1}};int f[m+2][n+2]={1,1,1,1,1,1,1,//0可以过                 1,0,0,0,1,0,1,                 1,0,1,0,0,0,1,                 1,0,0,1,0,1,1,                 1,1,1,0,1,0,1,                 1,0,1,1,1,0,1,                 1,1,1,1,1,1,1};int dfs(int x,int y){int i,x1,y1;if(x==m&&y==n){ans++;return 0;}else{for(i=0;i<8;i++){x1=x+a[i][0];y1=y+a[i][1];if(f[x1][y1]==0){f[x1][y1]=1;dfs(x1,y1);f[x1][y1]=0;}}}return 0;}int main(){f[1][1]=0;dfs(1,1);printf("%d",ans);return 0;} 

原创粉丝点击