JAVA算法:N皇后问题(JAVA代码)

JAVA算法:N皇后问题(JAVA代码)

n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。

JAVA算法:N皇后问题(JAVA代码)_第1张图片

 

给定一个整数 n,返回所有不同的 n 皇后问题的解决方案。
每一种解法包含一个明确的 n 皇后问题的棋子放置方案,该方案中 'Q' 和 '.' 分别代表了皇后和空位。
示例:

 

输入: 4
输出: [
 [".Q..",  // 解法 1
  "...Q",
  "Q...",
  "..Q."],

 ["..Q.",  // 解法 2
  "Q...",
  "...Q",
  ".Q.."]
]
解释: 4 皇后问题存在两个不同的解法。

 


算法设计

package com.bean.algorithm.basic;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;

public class NKing {
	public List> solveNQueens(int n) {
		boolean[] column = new boolean[n];
		// 2*n个斜对角线
		boolean[] leftDiagonal = new boolean[2 * n];
		boolean[] rightDiagonal = new boolean[2 * n];
		List> result = new ArrayList<>();
		backtrack(result, new ArrayList<>(), column, leftDiagonal, rightDiagonal, 0);

		return result;
	}

	private void backtrack(List> result, List current, boolean[] column, boolean[] leftDiagonal,
			boolean[] rightDiagonal, int rowIndex) {
		int N = column.length;
		if (rowIndex == N) {
			result.add(new ArrayList(current));
			return;
		}

		for (int i = 0; i < N; i++) {
			// 这一列、正对角线、反对角线都不能再放了,如果发现是true,停止本次循环
			if (column[i] || leftDiagonal[rowIndex + i] || rightDiagonal[rowIndex - i + N - 1]) {
				continue;
			}

			// init一个长度为n的一维数组,里面初始化为'.'
			char[] charArray = new char[N];
			Arrays.fill(charArray, '.');

			charArray[i] = 'Q';
			String stringArray = new String(charArray);
			current.add(stringArray);
			// 只要当前的行放下一个皇后,这一列、对角、反对角线都不能再放了.标记完后进行回溯
			column[i] = true;
			leftDiagonal[rowIndex + i] = true;
			rightDiagonal[rowIndex - i + N - 1] = true;

			backtrack(result, current, column, leftDiagonal, rightDiagonal, rowIndex + 1);

			// reset 不影响回溯的下个目标
			current.remove(current.size() - 1);
			charArray[i] = '.';
			column[i] = false;
			leftDiagonal[rowIndex + i] = false;
			rightDiagonal[rowIndex - i + N - 1] = false;
		}
	}
	
	
	public void displayResult(List list) {
		Iterator itx=list.iterator();
		while(itx.hasNext()) {
			String str=itx.next();
			System.out.println(str);
		}
		System.out.println();
	}

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int n = 4;

		NKing nking = new NKing();
		List> list = nking.solveNQueens(n);
		Iterator> itx = list.iterator();
		while (itx.hasNext()) {
			List listString = itx.next();
			nking.displayResult(listString);
		}
		System.out.println();
	}

}

程序运行结果:

.Q..
...Q
Q...
..Q.

..Q.
Q...
...Q
.Q..

 

你可能感兴趣的:(算法分析与设计)