数据结构与算法
递归Recursion、迷宫回溯、八皇后问题、排列组合
对于递归大家应该都不陌生了,我们直接看递归的应用。
迷宫回溯
给定一个二维数组,用1表示墙壁,0表示道路,当使用者指定入口和出口时,程序可以从入口走出迷宫。
如这个二维数组:
1 | 1 1 1 1 1 |
因为要求比较低,所以实现起来比较简单:
java实现
1 | package Recursion; |
输出结果
1 | 该地图的二维数组行数:6 |
八皇后Eight queens
百度百科:
在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。
针对这个问题,我们可以把棋盘简化成一个普通数组, 把棋盘行数对应为数组下标即可,而不必使用二维数组来表示棋盘,如:
1 | array[8]={0, 6, 3, 5, 7, 1, 4, 2} |
判断是否在同一列
- 只需判断与之前已有的值是否相同,设当前行号为
n,之前行号为pastN,若在同一列,则有:
1
array[n] == array[pastN]
- 只需判断与之前已有的值是否相同,设当前行号为
判断是否在同一斜线
- 只需判断
行号之间的差值,与对应行棋子所在位置的差值,是否相同,需要用绝对值来判断:
1
2//Math.abs(a)返回a的绝对值
Math.abs( array[n] - array[pastN] )==Math.abs( n - pastN)- 只需判断
判断是否在同一行
- 显然一维数组不可能有同一行,所以无需判断
java实现
先看一个比较简单的java实现,以后我们再对它进行优化:
1 | package Recursion; |
输出结果
1 | 第1次的棋子已经放完:[0, 4, 7, 5, 2, 6, 1, 3] |
所以我们可以看到,共有92种放法。
排列组合
不多说,如
1 | package Recursion; |