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

问题描述
一个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;
}


  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值