您的位置:首页 > 编程语言

华为编程大赛——公交站寻址

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. 在每个点都判断上-右-下-左顺时针四个方向是否可以进行搜索,需要个冲突检测函数

#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: