华为编程大赛——公交站寻址
2014-07-29 15:34
148 查看
问题描述
一个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. 在每个点都判断上-右-下-左顺时针四个方向是否可以进行搜索,需要个冲突检测函数
一个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; }
相关文章推荐
- 第六届华为创新杯编程大赛-----电话号码本的设计
- 第六届华为创新杯编程大赛-进阶1第1轮
- 2013华为杯编程大赛成都第三组试题--------题目 A: 路灯统计
- [华为机试真题]73.公交站寻址
- 第六届华为创新杯编程大赛-进阶1第1轮 洞穴逃生 (bfs + 优先队列)
- 2014第六届华为创新杯编程大赛初赛解题报告
- 2013华为杯编程大赛成都第三组试题及答案
- 第六届华为创新杯编程大赛-进阶1第3轮
- 2014第六届华为创新杯编程大赛初赛解题报告
- 2011年华为杯校园编程大赛
- intel2011多线程编程大赛之一Game Of Life 最优寻址多线程
- 第五届华为“创新杯”编程大赛初赛题目(第二场)
- 华为2012第四届编程大赛初赛题目(4-22下午)
- 华为12年编程大赛:将字符串中的数字进行排序
- 【 2013华为杯编程大赛成都第三组前两题试题及答案】
- 华为2014编程大赛初赛
- 华为第四届编程大赛题目
- 2012年华为软件校园招聘编程测验(又名:2012华为创新杯编程大赛)软件Java语言类原题与解答
- 【大坑特坑】第六届华为“创新杯”编程大赛初赛题目(第五场)
- 华为编程大赛--洞穴逃生