笨笨熊搬家交通篇
来源:互联网 发布:淘宝商城童装 编辑:程序博客网 时间:2024/05/01 00:11
笨笨熊搬家交通篇
描述:
森林里的苯苯熊要乔迁新喜,上次他已经将物品打包完成,并约了朋友来帮忙。接下来他要选定一个搬家的时间,想了很久,就决定在国庆节进行,因为国庆放假朋友们都有时间啦。但是在森林里,从他现在房子到新豪宅,所经之地有山有水,路途曲折,甚至有些道路是不通的。
请你和他一起查看指定的地图,看看从笨笨熊现在的房子到新宅之间,道路是否是畅通的呢?
地图是R行、C列的矩阵,矩阵的每一个格子刚好是一天的行程。
矩阵由“B”、“-”、“#”、“H”四种字符成员组成,其中:
B: 代表苯苯熊现在的房子;
H: 代表笨笨熊新的豪宅;
-: 代表可以通行的道路;
#: 代表无法通过的障碍(高山、大河等);
此外,森林里也有交通规则地:在任务位置,只能向“上、下、左、右”四个方向中的其中一个方向行走。
运行时间限制:
无限制
内存限制:
无限制
输入:
4 // R的数值
4 // C的数值,下面是地图。
--##---
B-----H
#---#--
-------
输出:
Y //代表道路可达
或
N //代表道路不通
样例输入:
1
5
-B-H#
样例输出:
Y
思路:递归。从笨笨熊现在的房子处开始,分别从上下左右四个方向进行递归搜索。在递归的时候,要注意不要像来的方向返回去找。如当前位置为(1,2),向上查找时,到(0,2)位置处,在对(0,2)进行查找时,就不要向下再次查找(1,2)位置,不然会形成死循环。这个问题在代码中由如下体现:
1 != iDir + i && 5 != iDir + i
这里特别说明下:
根据定义的方向数组,int iDirection[4][2] = {{0,-1}, {0, 1}, {-1, 0}, {1,0}};//方向, 左右上下
iDir是取二维数组中行的下标,所以,iDir= 0,表示向左;iDir=1,向右;iDir=2,向上;iDir=3,向下
iDir表示上一个搜索位置到当前搜索位置的方向,如当前为(1,2),如果上一个为(1,1),此时iDir=2,表示从(1,1)到(1,2)是向右搜索的。
i是对当前位置进行搜索的四个方向,也是iDirection[4][2]中一维的下标。接着刚才的例子,在对(1,2)进行搜索时,就不能回到(1,1),即 i 在遍历四个方向时,不能向左搜索,即不能等于 0, 所以 i+iDir != 1;
上下不能返回查找, 即i+ iDir != 5;(读者可自行分析)
PS:如果数组iDirection[4][2]中定义的方向顺序不一样,这里
#include <stdio.h>#include <string.h>#include <malloc.h>//查找路径//iRow:地图的总行数//iCol:地图的总列数// chInMap: 地图,以为数组形式输入//iCur: 当前所在行//iCurCol: 当前所在列//iDir: 上个位置到当前位置的方向//iIsFirst: 是否是第一次调用,如果是第一次调用,需要找到起点(即老房子所在行列)int FindPath(int iRow, int iCol, char *chInMap, int iCurRow, int iCurCol, int iIsFirst, int iDir){if (iCurRow >= iRow || iCurCol >= iCol || iCurCol < 0 || iCurRow < 0){return 0;}int iDirection[4][2] = {{0,-1}, {0, 1}, {-1, 0}, {1,0}};//方向, 左右上下int iIsBeak = 0;if(iIsFirst == 1){int iRow_i, iCol_i;//找到老房子for (iRow_i = 0; iRow_i<iRow; iRow_i++){for (iCol_i=0; iCol_i<iCol; iCol_i++){if (chInMap[iRow_i * iCol + iCol_i] == 'B'){iIsBeak = 1;break;}}if (iIsBeak == 1){break;}}iCurRow = iRow_i; iCurCol = iCol_i;}int i=0;for (; i<4; i++){//到达新居if (chInMap[(iCurRow + iDirection[i][0])* iCol + iCurCol + iDirection[i][1]] == 'H'){return 1;}//路可行,且不是当前的的来路if (chInMap[(iCurRow + iDirection[i][0]) * iCol + iCurCol + iDirection[i][1]] == '-'&& 1 != iDir + i && 5 != iDir + i){if(1 == FindPath(iRow, iCol, chInMap, iCurRow + iDirection[i][0], iCurCol + iDirection[i][1], 0, i)){return 1;}}//换一个方向试探else{continue;}}return 0;}void main(){int iRow = 0;int iCol = 0;scanf("%d", &iRow);scanf("%d", &iCol);char * pchTmp = (char *)(malloc)(sizeof(char) * (iCol + 1));char * pchMap = (char *)(malloc)(sizeof(char) * (iCol * iRow + 1));char * pchMapTmp = pchMap;if (NULL == pchTmp || NULL == pchMap){return;}int i=0;for (; i<iRow; i++){scanf("%s", pchTmp);memcpy(pchMapTmp, pchTmp, sizeof(char) * (iCol + 1));pchMapTmp += sizeof(char) * (iCol);}int iRst;iRst = FindPath(iRow, iCol, pchMap, 0, 0, 1, -5);if (iRst == 1){printf("Y\n");}else{printf("N\n");}}
是不同的。
- 笨笨熊搬家交通篇
- 笨笨熊搬家交通篇
- 笨笨熊搬家交通篇
- 笨笨熊搬家之交通篇
- 2015华为实习笨笨熊搬家交通篇JAVA/C++
- 华为编程大赛之笨笨熊搬家交通篇答案(供参考。)
- 华为2015年编码大赛—笨笨熊搬家交通篇JAVA实现
- 设计模式之State——交通篇(原创)
- 设计模式之State——交通篇
- 智慧交通篇 2 —— 公交刷卡(非接触IC卡)系统全透析
- 笨笨熊交通篇--广度搜索
- mysql类 通篇注释
- 笨笨熊搬家打包篇
- 搬家
- 搬家
- 搬家
- 搬家
- 搬家
- TGridPanel TFlowPanel
- LINUX5.5 LINUX5.5 VMTools 安装 oracle 11g安装
- wust-1299-结点选择(树形DP)
- cocoa自定义设置button字体颜色方法
- Dos命令---目录命令
- 笨笨熊搬家交通篇
- Linux下搜索命令简介
- oracle 无监听程序 问题解决 我遇到了N+1回了 就靠这个解决了
- ASP.NET 关于设置上传文件导致的问题
- c的基础 1. 无符号数和补码
- MP4文件格式详解
- Maven学习
- Linux Shell 脚本应用——使用for循环
- 20060410-Quick tip: Determining uniqueness of local maximum