八皇后问题(回溯法求解)
问题描述
在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线(包括反斜线)上,问有多少种摆法。
解题思路
八皇后问题,是回溯算法的典型案例,可以使用回溯法解决该题。
第一个皇后先放第一行第一列,然后第二个皇后放在与第一个皇后不冲突的列,继续第三个皇后,……直到第8个皇后也能放在一个不冲突的位置,算是找到了一个正确解。然后回头继续第一个皇后放第二列,后面继续循环……
代码实现
private static int max; // 皇后的个数 private static int[] cols; // 记录已放置皇后所在的列数 // 判断将要放置的皇后与已放置的是否冲突 private static boolean judge(int n) { for (int i=0; i<n; i++) // 是否与皇后i处于同一列或同一斜线上 if (cols[i]==cols[n] || Math.abs(cols[i]-cols[n])==Math.abs(n-i)) return false; return true; } private static int count = 0; // count种不同的摆法 private static void test(int n) { // max个皇后已经放置完成,得到一种摆法,count加一 if (n == max) { count++; return; } for (int i=0; i<max; i++) { cols[n] = i; if (judge(n)) test(n+1); // 皇后n满足要求,放置下一个皇后 } } public static int eightQueen(int queenNums) { max = queenNums; cols = new int[max]; test(0); return count; }
测试结果如下:
public static void main(String[] args) { System.out.println(eightQueen(8)); // 92 }
mark
posted on 2018-09-06 09:50 Deltadeblog 阅读(405) 评论(0) 编辑 收藏 举报