代码如下:主要思路就是 上一行与当前行的 y坐标不能是相差为1的,比如 第一行y坐标是2,那么第二行y坐标就不能是 1或3,这样就不会形成对角线,然后y坐标不能重复,比如第一行y坐标已经为1,那么后面行的y坐标就不能为1了
import java.util.ArrayList;
import java.util.List;
public class Solution {
public static void main(String[] args) {
List<List<String>> lists = solveNQueens(4);
// System.out.println(lists);
}
public static List<List<String>> solveNQueens(int n) {
List<Integer> xList = new ArrayList<>();
List<List<String>> rList = new ArrayList<>();
for (int i = 0; i < n; i++) {
int r = random(n, xList);
xList.add(r);
if (i > 0) {
Integer t = xList.get(i);
Integer b = xList.get(i - 1);
if (b + 1 == t || t + 1 == b) {
check(i, n, xList);
}
}
}
System.out.println(xList);
for (Integer value : xList) {
List<String> sList = new ArrayList<>();
for (int j = 0; j < n; j++) {
if (value.equals(j)) {
//打印
System.out.print("Q ");
sList.add("Q ");
} else {
//打印
System.out.print(". ");
sList.add(". ");
}
}
//打印
System.out.println("");
rList.add(sList);
}
return rList;
}
/**
* 检验每两行的y坐标是否形成对角线
*
* @param i 下标
* @param n 方格大小
* @param xList 数组
*/
private static void check(int i, int n, List<Integer> xList) {
Integer t = xList.get(i);
Integer b = xList.get(i - 1);
//如果形成对角线,那么重新赋值
if (b + 1 == t || t + 1 == b) {
int random = random(n, xList);
if (!xList.contains(random)) {
xList.set(i, random);
}
check(i, n, xList);
}
}
/**
* 随机数生成
*
* @param n 方格大小
* @param list 数组
* @return int
*/
private static int random(int n, List<Integer> list) {
int r = (int) Math.floor(Math.random() * n);
boolean contains = list.contains(r);
//如果生成的随机数已经在数组中存在,那么重新生成直到不重复为止
if (contains) {
return random(n, list);
}
return r;
}
}
我这边的结果是一个数组,把数组的下标当作x,值为y,形成n*n的方格。