华为面试题:迷宫问题 C语言源码

定义一个二维数组N*M(其中2<=N<=10;2<=M<=10),如5 × 5数组下所示:

int maze[5][5] = {

0, 1, 0, 0, 0,

0, 1, 0, 1, 0,

0, 0, 0, 0, 0,

0, 1, 1, 1, 0,

0, 0, 0, 1, 0,

};

它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线。入口点为[0,0],既第一空格是可以走的路。

Input

一个N × M的二维数组,表示一个迷宫。数据保证有唯一解,不考虑有多解的情况,即迷宫只有一条通道。

Output

左上角到右下角的最短路径,格式如样例所示。

5 5

0 1 0 0 0

0 1 0 1 0

0 0 0 0 0

0 1 1 1 0

0 0 0 1 0

输出

(0,0)

(1,0)

(2,0)

(2,1)

(2,2)

(2,3)

(2,4)

(3,4)

(4,4)

#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#define MAX_PATH 256

int maze[10][10] = {0};
int route[100][2] = {0};
int main()
{
	int row=0,line=0;
	scanf("%d %d",&row,&line);
	for (int i=0;i<row;i++)
	{
		for (int j=0;j<line;j++)
		{
			scanf("%d",&maze[i][j]);
		}
	}
	//走迷宫
	//堆栈:记录上一个位置
	int xcurrent = 0;
	int ycurrent = 0;
	int count=0;
	while(true)
	{
		if (maze[xcurrent+1][ycurrent]==0 && xcurrent+1<row)
		{
			//返回上一个位置
			if (route[count-1][0]==xcurrent+1 && route[count-1][1]==ycurrent)
			{
				maze[xcurrent][ycurrent]=1;//设置为墙
				count--;
				xcurrent++;
			}
			else
			{
				route[count][0]=xcurrent;
				route[count][1]=ycurrent;
				count++;
				xcurrent++;
			}
		}
		else if (maze[xcurrent][ycurrent+1]==0 && ycurrent<line)
		{
			if (route[count-1][0]==xcurrent && route[count-1][1]==ycurrent+1)
			{
				maze[xcurrent][ycurrent]=1;//设置为墙
				count--;
				ycurrent++;
			}
			else
			{
				route[count][0]=xcurrent;
				route[count][1]=ycurrent;
				count++;
				ycurrent++;
			}
		}
		else if (maze[xcurrent-1][ycurrent]==0 && xcurrent-1>=0)
		{
			if (route[count-1][0]==xcurrent-1 && route[count-1][1]==ycurrent)
			{
				maze[xcurrent][ycurrent]=1;//设置为墙
				count--;
				xcurrent--;
			}
			else
			{
				route[count][0]=xcurrent;
				route[count][1]=ycurrent;
				count++;
				xcurrent--;
			}
		}
		else if (maze[xcurrent][ycurrent-1]==0 && ycurrent-1>=0)
		{
			if (route[count-1][0]==xcurrent && route[count-1][1]==ycurrent-1)
			{
				maze[xcurrent][ycurrent]=1;//设置为墙
				count--;
				ycurrent--;
			}
			else
			{
				route[count][0]=xcurrent;
				route[count][1]=ycurrent;
				count++;
				ycurrent--;
			}
		}
		if (xcurrent==row-1 && ycurrent==line-1)
		{
			route[count][0]=xcurrent;
			route[count][1]=ycurrent;
			count++;
			break;
		}
	}

	for (int i=0;i<count;i++)
	{
		printf("(%d,%d)\n",route[i][0],route[i][1]);
	}

	return 0;
}
时间: 2024-11-09 13:49:10

华为面试题:迷宫问题 C语言源码的相关文章

华为面试题:四则运算 C语言源码

四则运算 描述: 请实现如下接口 /* 功能:四则运算 * 输入:strExpression:字符串格式的算术表达式,如: "3+2*{1+2*[-4/(8-6)+7]}" * 返回:算术表达式的计算结果 */ public static int calculate(String strExpression) { /* 请实现*/ return 0; } 约束: pucExpression字符串中的有效字符包括['0'-'9'],'+','-', '*','/' ,'(', ')','

比特币挂机网赚易语言源码日赚200已上+网站+视频全套

是于易语言开发而成 在线挂机获取收益 软件内设VIP系统 提款系统 推广系统 等多功能化 如而要易语言程序源码的可以联系我QQ 382913699 注册的话需要下载软件,软件大小不到2M,下载下来后注册下,一般一天可以挖200块钱左右!提现的不是VIP一天只能提现1次,一次0.3元! VIP没有这个限制!首先我不是VIP所以不敢断言一定 所以请大家帮个忙,复制下网址访问下就可以了! 等访问量达到500一定给大家反馈下!就算是假的 一天领0.3元也好啊

Go语言源码中的Rabin-Karp算法

strings.go包实现了一个Rabin-Karp算法.有点意思. 关于这个算法: 图灵社区的有一篇: 图说Rabin-Karp字符串查找算法 关于Go源码实现: 网友GoLove已写一个篇非常详细的说明了. http://www.cnblogs.com/golove/p/3234673.html GoLove那个已经分析的非常清楚了,只是前面那一串说明太长了.我把他的说明替换成代码形式. 直接跑起来,这样更能看得清楚些. package main import ( "fmt" &q

Go语言源码中Replacer查找部份的笔记

用过strings.NewReplacer,replacer.Replace(),它按对传入参数后,能依优先级替换,并能处理中文字符串参数. 觉得功能强大,特别好用.对它的查找和优先级怎么处理有点兴趣,花时间研究了下源码,在这记录一下个人理解. package main //author:xcl //2014-1-20 记录 import ( "fmt" "strings" ) func main(){ patterns := []string{ "y&q

go语言源码赏析之strings

0.字符串为不可变类型,内部使用指针指向UTF-8字节数组 不过要修改字符串可以先将其转换成[]byte或者[]rune.如下 package main func main() { s := "abcd" bs := []byte(s) bs[1] = 'B' println(string(bs)) u := "电脑" us := []rune(u) us[1] = '话' println(string(us)) } 输出: aBcd 电话 for遍历字符串有byt

华为面试题:扑克牌大小 C语言源码

扑克牌游戏大家应该都比较熟悉了,一副牌由54张组成,含3~A.2各4张,小王1张,大王1张.牌面从小到大用如下字符和字符串表示(其中,小写joker表示小王,大写JOKER表示大王): 3 4 5 6 7 8 9 10 J Q K A 2 joker JOKER 输入两手牌,两手牌之间用"-"连接,每手牌的每张牌以空格分隔,"-"两边没有空格,如:4 4 4 4-joker JOKER. 请比较两手牌大小,输出较大的牌,如果不存在比较关系则输出ERROR. 基本规则

华为面试题:识别有效的ip地址和子网掩码并分类 C语言源码

识别有效的ip地址和子网掩码并分类: 按行输入多组数据 10.8.9.2~255.0.0.0 180.8.9.2~255.254.0.0 打印:A B C D E 错误的ip或掩码 私有ip 的个数 #include "stdio.h" #include "stdlib.h" #include "string.h" #define MAX_PATH 256 int maze[10][10] = {0}; int route[100][2] = {

华为面试题:开放的书名检索库 c语言源码

开放的书名检索库 实现一个开放的书名检索库.库中存储了若干个书名.用户可以:指定搜索条件,搜索库中符合条件的书名 重要格式说明 单词 由小写英文字母组成,不含其它字符. 书名 由一个或多个单词组成. 当包含多个单词时,单词间用一个空格分隔:第一个单词前和最后一个单词后没有空格. 若只包含一个单词,则该单词前后均无空格. 搜索条件 1.由一个或多个不重复的关键字组成,每个关键字是一个单词. 2.当包含多个关键字时,关键字间用一个空格分隔:第一个关键字前和最后一个关键字后没有空格. 3.若只包含一个

栈的C语言源码

1.导言(为什么要用栈?) 通常来说,决定采用何种方式来存储数据是非常重要的,这样便于对数据检索时,数据会自动按照某种规定的顺序给出.栈和队列是检索数据的一种常用的数据结构.栈和队列是两种非常重要的数据结构,从数据结构来看,栈和队列也是线性表.是操作受限的线性表,栈只能在一端(栈顶)进行插入和删除,队列只能在一端(队尾)进行插入在另一端(队头)进行删除.但是从数据类型来说,栈和队列是和线性表不大相同两类重要的抽象数据类型.这里,首先重点介绍栈,以及栈的先关操作的c语言实现.栈是按照后进先出(LI