赞
踩
1 是什么N皇后问题?
八皇后问题,是一个古老而著名的问题.该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法?
2 什么是回溯法?
回溯法(back tracking)(探索与回溯法)是一种选优搜索法,又称为试探法,按选优条件向前搜索,以达到目标。 但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足回溯条件的某个状态的点称为"回溯点"。
代码:
- public class NQueens {
- public static boolean isValid(int[] record, int i, int j) {
- for (int k = 0; k < i; k++) {
- if (j == record[k] || Math.abs(record[k] - j) == Math.abs(i - k)) {
- return false;
- }
- }
- return true;
- }
-
- public static int num2(int n) {
- if (n < 1 || n > 32) {
- return 0;
- }
- int upperLim = n == 32 ? -1 : (1 << n) - 1;
- return process2(upperLim, 0, 0, 0);
- }
-
- public static int process2(int upperLim, int colLim, int leftDiaLim,
- int rightDiaLim) {
- if (colLim == upperLim) {
- return 1;
- }
- int pos = 0;
- int mostRightOne = 0;
- pos = upperLim & (~(colLim | leftDiaLim | rightDiaLim));
- int res = 0;
- while (pos != 0) {
- mostRightOne = pos & (~pos + 1);
- pos = pos - mostRightOne;
- res += process2(upperLim, colLim | mostRightOne,
- (leftDiaLim | mostRightOne) << 1,
- (rightDiaLim | mostRightOne) >>> 1);
- }
- return res;
- }
-
- public static void main(String[] args) {
- int n = 8;
- System.out.println("n=8");
- long start = System.currentTimeMillis();
- System.out.println(num2(n));
- long end = System.currentTimeMillis();
- System.out.println("cost time: " + (end - start) + "ms");
-
-
- }
- }
结果:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。