方法1
public class Queen {
static int n=8,count;
public static void main(String[] args){
int[][] mainChess=new int[n][n];
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
mainChess[i][j]=0;
}
}
putChess(0,mainChess);
}
private static void putChess(int row, int[][] chess) {
int[][] currentChess=(int[][])chess.clone();
if(row==n)
{
count++;
System.out.println("第"+count+"中:");
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
System.out.println(currentChess[i][j]);
}
System.out.println();
}
System.out.println();
return;
}else{
for(int i=0;i<n;i++){
if(!isDanger(row,i,currentChess)){
for(int j=0;j<n;j++){
currentChess[row][j]=0;
}
currentChess[row][i]=1;
putChess(row+1,currentChess);
}
}
}
}
private static boolean isDanger(int row, int col, int[][] currentChess) {
for(int i=0;i<row;i++){
if(currentChess[i][col]==1) return true;
for(int j=0;j<n;j++){
if((row+col)==(i+j)||(row-col)==(i-j)&¤tChess[i][j]==1) return true;
}
}
return false;
}
}
方法2(わかりにくい)
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class Nqueen2 {
static List<List<String>> lists = new ArrayList<>();//返回集合
static List<String> ans = new ArrayList<>();//n皇后的解
public static List<List<String>> solveNQueens(int n) {
Map<Integer,String> param = new HashMap<>();
for(int i = 0; i < n; i++){//......
StringBuilder sb = new StringBuilder();
for(int j = 0; j < n;j++) {
if(j == i)sb.append("Q");
else sb.append(".");
}
param.put(i,sb.toString());
}
//列的大小为n,主对角线和次对角线的大小为2n-1
queens(n, new boolean[n], new boolean[2 * n - 1], new boolean[2 * n - 1], param,0);
return lists;
}
static void queens(int n,boolean[] y,boolean[] w,boolean[] wc, Map<Integer,String> param,int i){
if(ans.size() == n){//递归结束条件,即n皇后已放置所有的行中
lists.add(new ArrayList<>(ans));
return;
}
for(int j = 0; j < n; j++){
//判断当前位置是否可用,即列、主对角线、次对角线是否被使用
if(y[j] || w[n - 1 - i + j] || wc[i + j]) continue;
//如果可用,先标记该列、主对角线、次对角线已被使用
y[j] = true;
w[n - 1 - i + j] = true;
wc[i + j] = true;
ans.add(param.get(j));
//递归下一行是否可以放置皇后,直到所有皇后都放到对应的位置或者该行无法放置皇后则结束
queens(n,y,w,wc,param,i+1);
//递归完成之后,恢复现场
ans.remove(i);
y[j] = false;
wc[i + j] = false;
w[n - 1 - i + j] = false;
}
}
public static void main(String[] args) {
System.out.println(solveNQueens(4));
}
}