## 森林里的苯苯熊要乔迁新喜,上次他已经将物品打包完成,并约了朋友来帮忙。接下来他要选定一个搬家的时间,想了很久,就决定在国庆节进行,因为国庆放假朋友们都有时间啦。但是在森林里,从他现在房子到新豪宅,所经之地有山有水,路途曲折,甚至有些道路是不通的。
请你和他一起查看指定的地图,看看从笨笨熊现在的房子到新宅之间,道路是否是畅通的呢?
地图是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
#include
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+11][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+11]==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; icin>>p[i];
flag[i]=new bool[c];
road[i]=new int[c];
for(int j=0; jfalse;
}
for(int i=0; ifor(int j=0; jif(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
result=findPath(road,startx,starty,flag);
if(result)
cout<<"Yes"<else
cout<<"No"<for(int i=0;idelete []road[i];
delete []flag[i];
}
delete []p;
return 0;
}