为啥叫N皇后问题,因为这是八皇后问题扩展至N的情况
八皇后问题:如何能够在 8×8 的国际象棋棋盘上放置八个皇后,使得任何一个皇后都无法直接吃掉其他的皇后?为了达到此目的,任两个皇后都不能处于同一条横行、纵行或斜线上。
代码实现:我参照了韩顺平老师在用java讲解数据结构时的代码
JAVA语言实现:
public class EightQueens {
/**
* 主方法,获取结果
* @param n N皇后,这里的n就是N
* @return 返回一个包含结果的数组
*/
List<int[]> getResults(int n){
List<int[]> res=new ArrayList<>();
int chessboard[]=new int[n];
placeQueen(res,chessboard,n,0);
return res;
}
/**
* 放置棋子
* @param list 是最终的结果列表
* @param chessboard 棋盘数组
* @param max 棋盘可摆放的最大值
* @param temp 当前摆放的棋子
*/
void placeQueen(List<int[]> list,int[] chessboard,int max,int temp){
if (temp==max){
list.add(chessboard.clone());
return;
}
for (int i = 0; i <max ; i++) {
chessboard[temp]=i;
if(checkResult(chessboard,temp)){
placeQueen(list,chessboard,max,temp+1);
}
}
}
/**
* 确认棋盘目前是否摆放正确
* @param chessboard 棋盘
* @param n 第n位棋子
* @return 结果(布尔值)
*/
boolean checkResult(int[] chessboard,int n){
for (int i = 0; i <n ; i++) {
if (chessboard[i]==chessboard[n]||Math.abs(n-i)==Math.abs(chessboard[n]-chessboard[i])){
return false;
}
}
return true;
}
}
Go语言实现:
func getResults(n int) *list.List {
res:=list.New()
chessboard:=make([]int,n)
placeQueen(res,chessboard,n,0)
return res
}
func checkResult(chessboard []int,n int) bool {
for i:=0; i<n; i++ {
if chessboard[i]==chessboard[n]||math.Abs(float64(chessboard[i]-chessboard[n]))==float64(n-i){
return false
}
}
return true
}
func placeQueen(list *list.List,chessboard []int,max int,temp int) {
if temp==max {
chessboard2s:=make([]int,len(chessboard))
copy(chessboard2s,chessboard)
list.PushBack(chessboard2s)
return
}
for i:=0; i<max; i++ {
chessboard[temp]=i
if checkResult(chessboard,temp) {
placeQueen(list,chessboard,max,temp+1)
}
}
}
Python语言实现:
import copy
def get_results(n):
res = []
chessboard = [0] * n
place_queen(res, chessboard, n, 0)
return res
def place_queen(li, ch, ma, te):
if te == ma:
ch2s = copy.deepcopy(ch)
li.append(ch2s)
return
for i in range(ma):
ch[te] = i
if check_result(ch, te):
place_queen(li, ch, ma, te+1)
def check_result(ch, n):
for i in range(n):
if ch[i] == ch[n] or abs(ch[i] - ch[n]) == n-i:
return False
return True