【Leetcode】:51.N-Queens問題in 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..", //Solution 1 "...Q", "Q...", "..Q."], ["..Q.", //Solution 2 "Q...", "...Q", ".Q.."] ]
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
この問題の難易度はHardで,確かに工夫して作らなければならないが,依然として再帰的な考え方を採用して便利に解くことができる.
まずQの配置を表す簡便な方法が必要であり、1つのN長の配列がint[n]を解決することができ、例えばint[0]=1はQが1行目の2列目を表し、int[2]=3はQが3行目の4列目を表す.
表現を簡単にするには、カスタム関数が必要です.
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. [ [".Q..", //Solution 1 "...Q", "Q...", "..Q."], ["..Q.", //Solution 2 "Q...", "...Q", ".Q.."] ]
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
この問題の難易度はHardで,確かに工夫して作らなければならないが,依然として再帰的な考え方を採用して便利に解くことができる.
まずQの配置を表す簡便な方法が必要であり、1つのN長の配列がint[n]を解決することができ、例えばint[0]=1はQが1行目の2列目を表し、int[2]=3はQが3行目の4列目を表す.
表現を簡単にするには、カスタム関数が必要です.
private boolean isValid(int[] queenList, int row, int col)
関数は、指定された行列にQを配置できるかどうかを返します.ここでは、指定された行の上のQの配置が合法であることを前提としています.import java.util.List;
import java.util.ArrayList;
public class Solution {
public List> solveNQueens(int n) {
List> res = new ArrayList>();
int[] queenList = new int[n]; // i row ,Q
placeQueen(queenList, 0, n, res);// 0 Q
return res;
}
private void placeQueen(int[] queenList, int row, int n, List> res) {
// ,
if (row == n) {
ArrayList list = new ArrayList();
for (int i = 0; i < n; i++) {
String str = "";
for (int col = 0; col < n; col++){
if(queenList[i] == col) {
str += "Q";
} else {
str += ".";
}
}
list.add(str);
}
res.add(list);
}
for (int col = 0; col < n; col++) {//
if (isValid(queenList, row, col)) { // Q
queenList[row] = col;
placeQueen(queenList, row + 1, n, res);
}
}
}
private boolean isValid(int[] queenList, int row, int col) {
for (int i = 0; i < row; i++) {
int pos = queenList[i];
if (pos == col) { // Q
return false;
}
if (pos + row - i == col) { // Q
return false;
}
if (pos - row + i == col) { // Q
return false;
}
}
return true;
}
}