nqueens java_NQueens.java

/**

* The n-queens puzzle is the problem of placing n queens on an n×n chessboard such that no two queens attack each other.

*

* Given an integer n, return all distinct solutions to the n-queens puzzle.

*

* Each solution contains a distinct board configuration of the n-queens' placement, where 'Q' and '.' both indicate a queen and an empty space respectively.

*

* For example,

*

* There exist two distinct solutions to the 4-queens puzzle:

*

* [

* [".Q..", // Solution 1

* "...Q",

* "Q...",

* "..Q."],

*

* ["..Q.", // Solution 2

* "Q...",

* "...Q",

* ".Q.."]

* ]

*/

import java.util.ArrayList;

public class NQueens {

public ArrayList solveNQueens(int n) {

ArrayList ret = new ArrayList();

if (n == 0)

return ret;

StringBuffer line = new StringBuffer();

for (int i = 0; i < n; i++) {

line.append('.');

}

StringBuffer[] sol = new StringBuffer[n];

for (int i = 0; i < n; i++) {

sol[i] = new StringBuffer(line.toString());

}

boolean[] cols = new boolean[n];

int[] row = new int[n];

findSolutions(n, 0, ret, sol, row, cols);

return ret;

}

private void findSolutions(int n, int start, ArrayList ret,

StringBuffer[] sol, int[] row, boolean[] cols) {

if (start == n) {

String[] newSol = new String[n];

for (int i = 0; i < n; i++) {

newSol[i] = sol[i].toString();

}

ret.add(newSol);

} else {

for (int i = 0; i < n; i++) {

if (cols[i])

continue;

boolean ok = true;

for (int j = 0; j < start; j++) {

if (Math.abs(start - j) == Math.abs(i - row[j])) {

ok = false;

break;

}

}

if (ok) {

cols[i] = true;

sol[start].setCharAt(i, 'Q');

row[start] = i;

findSolutions(n, start + 1, ret, sol, row, cols);

row[start] = 0;

sol[start].setCharAt(i, '.');

cols[i] = false;

}

}

}

}

}

一键复制

编辑

Web IDE

原始数据

按行查看

历史

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值