迷宫问题

来源:互联网 发布:中世纪2原版优化第十版 编辑:程序博客网 时间:2024/04/29 17:22

问题描述:在n*m的迷宫中解救人质,人质在(p,q)处,你现在在(x,y)处,中间你会碰到墙,需要绕道走,求最快解救人质需要走的步数(墙表示为1)。

方案一:DFS

//迷宫问题 (x,y)——>(p,q) dfs#include <iostream>#include <string.h>using namespace std;#define N 11int vis[N][N],a[N][N];int vir[4][2]={{1,0},{-1,0},{0,1},{0,-1}};int n,m,x,y,p,q;int ans=1000000;void dfs(int nx,int ny,int step);int check(int nx,int ny);int main(){while(cin>>n>>m){int i,j;for(i=1;i<=n;i++){for(j=1;j<=m;j++){cin>>a[i][j];}}cin>>x>>y>>p>>q; dfs(x,y,0);cout<<ans<<endl;} return 0;} void dfs(int nx,int ny,int step){if(nx==p && ny==q){ if(ans>step)    ans=step;         return ;}int i;for(i=0;i<4;i++){int fx=nx+vir[i][0];int fy=ny+vir[i][1];if(check(fx,fy)==1 && vis[fx][fy]==0){vis[fx][fy]=1;dfs(fx,fy,step+1);vis[fx][fy]=0;}}return ;}int check(int nx,int ny){if(nx<1 || ny<1 || nx>n || ny>m || a[nx][ny]==1)return 0;else return 1;}


方案二:BFS

//迷宫问题 (x,y)——>(p,q) bfs#include <iostream>#include <string.h>#include <queue>using namespace std;#define N 11struct node{int xx,yy;int step;};int vis[N][N],a[N][N];int vir[4][2]={{1,0},{-1,0},{0,1},{0,-1}};int n,m,x,y,p,q;queue<node>qq;void bfs();int check(int nx,int ny);int main(){while(cin>>n>>m){int i,j;for(i=1;i<=n;i++){for(j=1;j<=m;j++){cin>>a[i][j];vis[i][j]=0;}}cin>>x>>y>>p>>q; bfs();}return 0;} void bfs(){struct node aa,b,c;aa.xx=x;aa.yy=y;aa.step=0;vis[x][y]=1;qq.push(aa);int i;while(!qq.empty()){b=qq.front();qq.pop();if(b.xx==p && b.yy==q){cout<<b.step<<endl;}for(i=0;i<4;i++){int fx=b.xx+vir[i][0];int fy=b.yy+vir[i][1];if(check(fx,fy)==1 && vis[fx][fy]==0){c.xx=fx;c.yy=fy;c.step=b.step+1;vis[fx][fy]=1;qq.push(c);}}}}int check(int nx,int ny){if(nx<1 || ny<1 || nx>n || ny>m || a[nx][ny]==1)return 0;else return 1;}



0 0
原创粉丝点击