动态路径规划(一)

笨笨熊搬家交通版

题目描述:

## 森林里的苯苯熊要乔迁新喜,上次他已经将物品打包完成,并约了朋友来帮忙。接下来他要选定一个搬家的时间,想了很久,就决定在国庆节进行,因为国庆放假朋友们都有时间啦。但是在森林里,从他现在房子到新豪宅,所经之地有山有水,路途曲折,甚至有些道路是不通的。
请你和他一起查看指定的地图,看看从笨笨熊现在的房子到新宅之间,道路是否是畅通的呢?
地图是R行、C列的矩阵,矩阵的每一个格子刚好是一天的行程。
矩阵由“B”、“-”、“#”、“H”四种字符成员组成,其中:
B:代表苯苯熊现在的房子;
H:代表笨笨熊新的豪宅;
-:代表可以通行的道路;
#:代表无法通过的障碍(高山、大河等);
此外,森林里也有交通规则地:在任务位置,只能向“上、下、左、右”四个方向中的其中一个方向行走。

运行时间限制: 无限制
内存限制: 无限制
输入: 4 // R的数值
4 // C的数值,下面是地图。
-##-
B–H
#-#-
输出: Y //代表道路可达

N //代表道路不通
样例输入: 1
5
-B-H#
样例输出: Y

解题思路:

在一个二维数组中分别用raod[i][j]=0来表示到坐标(i,j)点的道路不可通行和road[i][j]=1来表示到坐标点(i,j)的道路是可通行的。同时,用一个布尔型二维数组flag来标志某点坐标是否被访问过,通过将road和flag以及坐标点a和b作为参数,从起点位置开始进行迭代,分别从上、下、左、右四个方向遍历所有坐标点,同时标志该点已经被访问,不需要再访问,若可以访问到终点坐标,则返回true,否则返回false。对于每个坐标点都需要从上下左右四个方向迭代遍历,每次迭代遍历前都需要首先进行坐标合法,该点是否已遍历,已经该点是否可通行的判断。

#include<iostream>
#include<string>
using namespace std;

static int r,c;
static int destx,desty;
bool findPath(int **road,int a,int b,bool **flag)
{
    if(a==destx && b==desty)
        return true;
    flag[a][b]=true;
    //从上,下,左,右四个方向分别递归判断
    if(a-1>=0 && flag[a-1][b]==0 && road[a-1][b]==1)
    {
        if(findPath(road,a-1,b,flag))
            return true;
    }
    if(a+1<c && flag[a+1][b]==0 && road[a+1][b]==1)
    {
         if(findPath(road,a+1,b,flag))
             return true;
    }
    if(b-1>=0 && flag[a][b-1]==0 && road[a][b-1]==1)
    {
         if(findPath(road,a,b-1,flag))
             return true;
    }
    if(b+1<c && flag[a][b+1]==0 && road[a][b+1]==1)
    {
        if(findPath(road,a,b+1,flag))
            return true;
    }
    return false;
}

int main()
{
    cin>>r>>c;
    string *p=new string[r];
    int **road=new int*[r];
    bool **flag=new bool*[r];
    bool result;
    int startx,starty;
    for(int i=0; i<r; i++)
    {
        cin>>p[i];
        flag[i]=new bool[c];
        road[i]=new int[c];
        for(int j=0; j<c; j++)
            flag[i][j]=false;
    }
    for(int i=0; i<r; i++)
        for(int j=0; j<c; j++)
        {
            if(p[i][j]=='#')
                road[i][j]=0;
            else if(p[i][j]=='-')
                road[i][j]=1;
            else if(p[i][j]=='B')
            {
                road[i][j]=1;
                startx=i;
                starty=j;
            }
            else if(p[i][j]=='H')
            {
                road[i][j]=1;
                destx=i;
                desty=j;
            }
        }
    /*调试使用 for(int i=0;i<r;i++) { for(int j=0;j<c;j++) cout<<p[i][j]<<" "; cout<<endl; for(int j=0;j<c;j++) cout<<road[i][j]<<" "; cout<<endl; } */
    result=findPath(road,startx,starty,flag);
    if(result)
        cout<<"Yes"<<endl;
    else
        cout<<"No"<<endl;
    for(int i=0;i<r;i++)
    {
        delete []road[i];
        delete []flag[i];
    }
    delete []p;
    return 0;
}

程序运行结果:

《动态路径规划(一)》

    原文作者:动态规划
    原文地址: https://blog.csdn.net/u012260238/article/details/48415879
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞