问题描述
一个N*N二维矩阵代表城市布局,元素值只有’.’,’X’ , ‘B’ , ‘S’,X代表当前位置,B代表路障,S代表公交站,’.’代表可行的路径。
现给定路径长度Y,找到能够到达的公交站的个数,路径中不能包含路障。
路径长度定义:
节点与其自身的距离为0
节点与其上、下、左、右四个相邻节点距离都为1
要求实现函数
int FindStat (const char *Map, unsigned int iArrN, unsigned int iPathLen)
【输入】Map: 城市布局
iArrN: 城市布局矩阵的行数
iPathLen: 给定的路径长度
【输出】无
【返回】能够到达的公交站个数
注:输入矩阵是以一维形式保存的二维数组,
比如输入为{‘A’, ‘B’, ‘C’, ‘D’, ‘E’, ‘F’,’G’, ‘H’, ‘I’},
实际上表示如下3*3的矩阵
‘A’,’B’,’C’,
‘D’,’E’,’F’,
‘G’,’H’,’I’
示例
输入:"...S........X.S.....S....", 5, 3
返回:2
输入:"S...S.........BS........X", 5, 5
一个N*N二维矩阵代表城市布局,元素值只有’.’,’X’ , ‘B’ , ‘S’,X代表当前位置,B代表路障,S代表公交站,’.’代表可行的路径。
现给定路径长度Y,找到能够到达的公交站的个数,路径中不能包含路障。
路径长度定义:
节点与其自身的距离为0
节点与其上、下、左、右四个相邻节点距离都为1
要求实现函数
int FindStat (const char *Map, unsigned int iArrN, unsigned int iPathLen)
【输入】Map: 城市布局
iArrN: 城市布局矩阵的行数
iPathLen: 给定的路径长度
【输出】无
【返回】能够到达的公交站个数
注:输入矩阵是以一维形式保存的二维数组,
比如输入为{‘A’, ‘B’, ‘C’, ‘D’, ‘E’, ‘F’,’G’, ‘H’, ‘I’},
实际上表示如下3*3的矩阵
‘A’,’B’,’C’,
‘D’,’E’,’F’,
‘G’,’H’,’I’
示例
输入:"...S........X.S.....S....", 5, 3
返回:2
输入:"S...S.........BS........X", 5, 5
返回:1
一开始看到“S...S.........BS........X”有点乱,其实每个点也代表一个位置,仍旧是二维数组的模样:
S 。 。 。 S
。 。 。。 。
。 。 。 。 B
S 。 。 。 。
。 。 。 。 X
从X出发,在规定的跳数内寻找到S的个数,其中遇到B表示不能从该点过去。
1. 代码结构有点类似深搜,需要个dfs函数
2. 在每个点都判断上-右-下-左顺时针四个方向是否可以进行搜索,需要个冲突检测函数
#include<iostream>
#include<string.h>
using namespace std;
int visited[50][50]={0};
//冲突检测函数
bool conflict(const char *Map, unsigned int iArrN, int iPathLen, int column, int row){
//越界了
if (!( column>=0 && column<=4 && row>=0 && row<=4))
return true;
//有障碍
if(Map[iArrN*column+row]=='B')
return true;
//程序执行到这里表示没有任何冲突
return false;
}
int dfs(const char *Map, unsigned int iArrN, unsigned int iPathLen, int column, int row){
int count=0;
if(Map[column*iArrN+row]=='S' && !visited[column][row]){
++count;
//防止多次走到某个站点,重复记录。————————关键代码
visited[column][row]=1;
}
if(0==iPathLen)//到达最远路径——————————递归的终止条件
return count;
//向上
if(!conflict(Map,iArrN,iPathLen-1, column-1, row)){
count+=dfs(Map,iArrN,iPathLen-1, column-1, row);
}
//向右
if(!conflict(Map,iArrN,iPathLen-1, column, row+1)){
count+=dfs(Map,iArrN,iPathLen-1, column, row+1);
}
//向下
if(!conflict(Map,iArrN,iPathLen-1, column+1, row)){
count+=dfs(Map,iArrN,iPathLen-1, column+1, row);
}
//向左
if(!conflict(Map,iArrN,iPathLen-1, column, row-1)){
count+=dfs(Map,iArrN,iPathLen-1, column, row-1);
}
return count;
}
int FindStat (const char *Map, unsigned int iArrN, unsigned int iPathLen){
for(int i=0;i<50;++i)//————————————————难以Debug的错误,下次使用visited数组时,需要复位
for(int j=0;j<50;++j)
visited[i][j]=0;
if(iArrN==0)
return 0;
int location=0;
int column,row;
const char *p=Map;
while(*p!='X' && *p!='\0'){//寻找起始位置
++location;
++p;
}
if(*p=='\0')
return 0;
else{
column=location/iArrN;
row=location%iArrN;
}
visited[row][column]=1;
return dfs(Map, iArrN, iPathLen, column, row);//调用关键函数
}
int main(){
char Map[]="S...S.........BS........X";
unsigned int iArrN=5, iPathLen=5;
cout<< FindStat(Map,iArrN, iPathLen)<<endl;
return 0;
}