N皇后问题求解

为啥叫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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容