迷宫问题和棋盘马走日问题都是搜索问题(找路径),一般采用DFS和BFS两种搜索算法都可以,如果要求是最短路径,则一般BFS解题,DFS则需要记录所有的可能路径,找到最短的那条。一般来说,迷宫问题的前进方向为四个(上下左右),障碍物直接用1和0来判断。而马走日则有特殊的障碍物判断规则,前进方向也扩展为了八个(上下左右和四个斜角)。下面就用算法实例来讲解这类问题的一般解法。
输入:一个二维矩阵,表示迷宫(0表示通道,1表示围墙)。
输出:一条走出迷宫的路径。
解题方法有两种:栈和队列。
最后生成的是深度优先搜索树,每个结点只访问一次,注意在入栈时要将maze的信息置为-1,表示已访问,不然会陷入死循环!!
【易错点记录】
例题一是最简单的带障碍物迷宫问题,下面增加限制条件:每个位置只能访问一次,求一种有多少种走法。
一般不求最短路径,只统计走法数,我们采用DFS递归的形式来解题。
【易错点记录】
memset函数的二维数组初始化:
输入:国际象棋的棋盘是$8 x 8$的方格(按顺序编号1~64)。现在给定马的起始位置,遍历整个棋盘,要求每个方格有且仅访问一次。
输出:遍历路径(编号序列)。
dfs递归遍历,用栈存储路径,起点任意(不一定有解)。
在国际象棋中,马的走法与中国象棋类似,即俗话说的“马走日”,下图所示即国际象棋中马每一步能到达的格子(箭头所指为每步到达位置)。现有一200 * 200大小的国际象棋棋盘,棋盘中仅有一个马,给定马的当前位置和目标位置,求出马最少需要多少跳才能从当前位置到达目标位置。
输入格式:已有文件txt格式文件里每一行有四个以空格分隔的整数,分别表示马当前位置及目标位置的横、纵坐标(Xs,Ys)和(Xe,Ye)。坐标由0开始。
文件输入样例:
1 1 2 1
1 5 5 1
输入说明第一行:马的当前位置为(1,1),目标位置为(2,1)。第二行:马的当前位置为(1,5),目标位置为(5,1)。
输出:文件里每一行第一个数字为1个整数,即马从当前位置跳到目标位置最少的跳数,然后以空格隔开,输出对应的最短路径坐标,坐标格式为(X, Y),每个坐标之间以空格隔开。所有路径输出后以回车换行。
输出样例:
3 (1, 1) (3, 2) (4, 0) (2, 1)
4 (1, 5) (2, 3) (4, 2) (6, 3) (5, 1)
第一行:马需要跳3次才可以从(1,1)到(2,1),对应的路径为(1, 1) (3, 2) (4, 0) (2, 1)。第二行:马需要跳4次才可以从(1,5)到(5,1),对应的路径为(1, 5) (2, 3) (4, 2) (6, 3) (5, 1)。