(简单) POJ 3984 迷宫问题,BFS。

  Description

  定义一个二维数组:

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表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线。
 
  水题,BFS然后记录路径就好。
 
代码如下:
#include<iostream>
#include<cstring>
#include<queue>
#include<utility>

using namespace std;

typedef struct pair<int,int> pii;

int vis[6][6];
int fa[6][6];

bool judge(int x,int y)
{
    if(x<0||y<0||x>4||y>4)
        return 0;

    if(vis[x][y])
        return 0;

    return 1;
}

void slove()
{
    queue < pii > que;
    pii temp,temp1;
    int t1,t2;

    que.push(make_pair(0,0));
    vis[0][0]=1;

    while(!que.empty())
    {
        temp=que.front();
        que.pop();

        t1=temp.first/5;
        t2=temp.first%5;
        fa[t1][t2]=temp.second;

        if(t1==4&&t2==4)
            return;

        --t1;
        if(judge(t1,t2))
        {
            vis[t1][t2]=1;
            temp1=make_pair(t1*5+t2,temp.first);
            que.push(temp1);
        }
        t1+=2;
        if(judge(t1,t2))
        {
            vis[t1][t2]=1;
            que.push(make_pair(t1*5+t2,temp.first));
        }
        --t1;
        --t2;    
        if(judge(t1,t2))
        {
            vis[t1][t2]=1;
            que.push(make_pair(t1*5+t2,temp.first));
        }    
        t2+=2;
        if(judge(t1,t2))
        {
            vis[t1][t2]=1;
            que.push(make_pair(t1*5+t2,temp.first));
        }
    }
}

void showans()
{
    int cou=0;
    int ans[30];
    int temp=24;

    while(temp)
    {
        ans[cou++]=temp;
        temp=fa[temp/5][temp%5];
    }

    cout<<"(0, 0)"<<endl;
    for(int i=cou-1;i>=0;--i)
        cout<<'('<<ans[i]/5<<", "<<ans[i]%5<<')'<<endl;
}

int main()
{
    ios::sync_with_stdio(false);

    while(cin>>vis[0][0])
    {
        for(int j=1;j<5;++j)
            cin>>vis[0][j];

        for(int i=1;i<5;++i)
            for(int j=0;j<5;++j)
                cin>>vis[i][j];

        slove();
        showans();
    }    

    return 0;
}
View Code

 

转载于:https://www.cnblogs.com/whywhy/p/4229923.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值