POJ 3984 迷宫问题

来源:互联网 发布:js input file value 编辑:程序博客网 时间:2024/06/05 03:10
定义一个二维数组:
int maze[5][5] = {0, 1, 0, 0, 0,0, 1, 0, 1, 0,0, 0, 0, 0, 0,0, 1, 1, 1, 0,0, 0, 0, 1, 0,};

它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线。
Input
一个5 × 5的二维数组,表示一个迷宫。数据保证有唯一解。
Output
左上角到右下角的最短路径,格式如样例所示。
Sample Input
0 1 0 0 00 1 0 1 00 0 0 0 00 1 1 1 00 0 0 1 0
Sample Output
(0, 0)(1, 0)(2, 0)(2, 1)(2, 2)(2, 3)(2, 4)(3, 4)(4, 4)

这道题和其他题有点不一样,一般都只是要求出最少步数即可,而这题要求啊我们输出路径。难免会有点棘手。这里给出三种方法:深搜,广搜,其中广搜有数组模拟队列实现和运用stl队列实现。

//深搜#include<stdio.h>#include<string.h>#include<queue>using namespace std;int flag,a[6][6],dir[4][2]={{0,1},{1,0},{0,-1},{-1,0}};bool vis[6][6];struct node{    int x,y;}s[30];bool can(int x,int y){   if(x<0||x>4||y<0||y>4||vis[x][y]||a[x][y]==1)        return false;   return true;}void dfs(int x,int y,int step){    s[step].x=x,s[step].y=y;//记录路径    if(x==4&&y==4)    {        flag=1;        for(int i=0;i<=step;i++)//输出路径            printf("(%d, %d)\n",s[i].x,s[i].y);        return ;    }    for(int i=0;i<4;i++)    {        int tx=x+dir[i][0];        int ty=y+dir[i][1];        if(can(tx,ty))        {            vis[tx][ty]=true;            dfs(tx,ty,step+1);            vis[tx][ty]=false;            if(flag)                return ;        }    }}int main(){    for(int i=0;i<5;i++)        for(int j=0;j<5;j++)            scanf("%d",&a[i][j]);    flag=0;    dfs(0,0,0);}
//广搜(数组模拟)#include<stdio.h>#include<string.h>#include<stdio.h>#include<string.h>#include<queue>using namespace std;int head,tail,a[6][6],dir[4][2]={{0,1},{1,0},{0,-1},{-1,0}};bool vis[6][6];struct node{    int x,y,path,step;}que[30];bool can(int x,int y){   if(x<0||x>4||y<0||y>4||vis[x][y]||a[x][y]==1)        return false;   return true;}void put(int x){    if(que[x].path!=-1)//倒向输出路径    {        put(que[x].path);        printf("(%d, %d)\n",que[x].x,que[x].y);    }}int main(){    for(int i=0;i<5;i++)        for(int j=0;j<5;j++)            scanf("%d",&a[i][j]);    printf("(0, 0)\n");    int head=0,tail=0;    vis[0][0]=true;    que[tail].x=que[tail].y=que[tail].step=0;    que[tail].path=-1;    tail++;    while(head<tail)    {        for(int i=0;i<4;i++)        {            int tx=que[head].x+dir[i][0];            int ty=que[head].y+dir[i][1];            if(can(tx,ty))            {                que[tail].x=tx;                que[tail].y=ty;                que[tail].step=que[head].step+1;                que[tail++].path=head;                vis[tx][ty]=true;            }            if(tx==4&&ty==4)            {//                printf("%d\n",que[tail-1].step);//这里可以输出最少的步数                put(head);                printf("(4, 4)\n");                return 0;            }        }        head++;    }}
//广搜(stl)#include<stdio.h>#include<string.h>#include<queue>using namespace std;int a[6][6],dir[4][2]={{0,1},{1,0},{0,-1},{-1,0}};bool vis[6][6];bool can(int x,int y){    if(x<0||x>4||y<0||y>4||vis[x][y]==true||a[x][y]==1)        return false;    return true;}struct node{    int x,y,step,pre[30];}start;node bfs(){    queue<node>q;    start.x=0;    start.y=0;    start.step=0;    q.push(start);    vis[start.x][start.y]=true;    node now,net;    while(!q.empty())    {        now=q.front();        q.pop();        if(now.x==4&&now.y==4)            return now;        for(int i=0;i<4;i++)        {            int nx=now.x+dir[i][0];            int ny=now.y+dir[i][1];            if(can(nx,ny))            {                net=now;                net.x=nx;                net.y=ny;                net.step=now.step+1;                net.pre[now.step]=i;                vis[nx][ny]=true;                q.push(net);            }        }    }    return now;}int main(){    for(int i=0;i<5;i++)        for(int j=0;j<5;j++)            scanf("%d",&a[i][j]);    node ans=bfs();    int x=0,y=0;    for(int i=0;i<=ans.step;i++)    {        printf("(%d, %d)\n",x,y);        x+=dir[ans.pre[i]][0];        y+=dir[ans.pre[i]][1];    }}
若有错误请大牛指出!