【算法】回溯法四步走 (9)

程序运行结果:

3.0 5.0 1.0 9.0 7.0 2.0 4.0 8.0 6.0 4.0 9.0 3.0 5.0 2.0 8.0 1.0 7.0 6.0 5.0 3.0 1.0 9.0 7.0 2.0 4.0 8.0 6.0 5.0 4.0 3.0 7.0 2.0 6.0 1.0 9.0 8.0 5.0 4.0 9.0 7.0 3.0 8.0 1.0 6.0 2.0 5.0 8.0 6.0 4.0 7.0 3.0 1.0 2.0 9.0 6.0 4.0 2.0 3.0 5.0 8.0 1.0 7.0 9.0 6.0 4.0 2.0 7.0 1.0 8.0 3.0 5.0 9.0 6.0 7.0 3.0 4.0 8.0 5.0 2.0 9.0 1.0 6.0 8.0 3.0 9.0 5.0 2.0 7.0 1.0 4.0 6.0 9.0 8.0 4.0 3.0 7.0 1.0 5.0 2.0 7.0 1.0 4.0 9.0 6.0 8.0 3.0 5.0 2.0 7.0 3.0 2.0 8.0 1.0 9.0 5.0 4.0 6.0 7.0 3.0 2.0 9.0 8.0 1.0 6.0 5.0 4.0 7.0 5.0 3.0 2.0 6.0 4.0 1.0 9.0 8.0 7.0 5.0 3.0 9.0 1.0 2.0 6.0 8.0 4.0 7.0 9.0 6.0 3.0 8.0 1.0 2.0 5.0 4.0 7.0 9.0 6.0 8.0 1.0 3.0 5.0 4.0 2.0 8.0 1.0 3.0 4.0 6.0 5.0 2.0 7.0 9.0 8.0 6.0 9.0 7.0 1.0 2.0 5.0 3.0 4.0 8.0 7.0 6.0 1.0 9.0 5.0 2.0 3.0 4.0 9.0 1.0 3.0 4.0 5.0 2.0 6.0 7.0 8.0 9.0 1.0 3.0 5.0 2.0 4.0 7.0 8.0 6.0 9.0 2.0 4.0 1.0 7.0 8.0 3.0 5.0 6.0 9.0 2.0 4.0 3.0 5.0 8.0 7.0 1.0 6.0 9.0 3.0 4.0 1.0 5.0 7.0 6.0 2.0 8.0 9.0 4.0 8.0 1.0 7.0 6.0 3.0 5.0 2.0 9.0 4.0 8.0 3.0 5.0 6.0 7.0 1.0 2.0 9.0 6.0 8.0 1.0 4.0 3.0 5.0 7.0 2.0 一共29种解法 方格填数

如下的10个格子填入0~9的数字。

【算法】回溯法四步走

要求:连续的两个数字不能相邻。(左右、上下、对角都算相邻)

一共有多少种可能的填数方案?

答案:

// 方格填数 public class Sy2 { public static void main(String[] args) { // TODO Auto-generated method stub Block bk = new Block(); bk.init(); bk.addNum(0);// , 0, 0); System.out.println("一共"+Block.sum+"种方案"); } } class Block { public int[][] b = new int[3][4]; public static int sum; /** * 初始化整个数组 */ public void init() { for (int i = 0; i < 3; i++) { for (int j = 0; j < 4; j++) { b[i][j] = -2; } } } /** * @param y y行 * @param x x列 * @param n 填数n * @return 返回此方格是否能填数 */ public boolean isAble(int y, int x, int n) { // y行 x列 填数n if (b[y][x] != -2) return false; for (int j = y - 1; j <= y + 1; j++) { for (int i = x - 1; i <= x + 1; i++) { if (j < 3 && j >= 0 && i < 4 && i >= 0) { if (b[j][i] == n - 1 || b[j][i] == n + 1) { return false; } } } } return true; } /** * @param n 填入数字n */ public void addNum(int n) { if (n > 9) { sum++; return; } for (int i = 0; i < 3; i++) { for (int j = 0; j < 4; j++) { if ((i == 0 && j == 0) || (i == 2 && j == 3)) continue; // 如果此方格能填数,则填入数字 if (this.isAble(i, j, n)) { b[i][j] = n; this.addNum(n + 1);// , y, x+1); b[i][j] = -2; // 当加入下一个不行返回后,还原现在方块,继续循环 } } } } }

程序运行结果:

一共1580种方案 蛙跳河

在一个 5*5 的地图上,一只蛙欲从起点跳到目的地。中间有一条河(如图),但这只蛙不会游泳,并且每次跳只能横着跳一格或者竖着跳一格。(聪明的蛙不会跳已经跳过的路)

总共有多少种跳法。

给出路径最短的跳法。

【算法】回溯法四步走

答案:

明确函数功能:jump(m, n)为跳到(m, n)位置。

寻找递归出口:不在边界之内 或 已走过。

明确所有路径:右跳、左跳、下跳、上跳

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zwwszw.html