栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

回溯法解决N皇后问题-java

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

回溯法解决N皇后问题-java

参照LeetCode第51题的题干,N皇后是指将N个皇后放置在NXN的棋盘上,并且皇后之间不可以互相攻击,即其中任意两个皇后不能在同一行、同一列或者同一条斜线上。

四皇后的放置情况示例如下:

采用回溯法解决该问题时需要将搜索过程抽象成一颗树,只要搜索到达了树的叶子节点,则等于找到了所有皇后合理的放置位置。

其中三皇后问题的解决思路如下,注意三皇后是无解的:

将整个棋盘抽象为坐标轴,按照从上到下的顺序放置皇后,每一行放置一个后即可进行下一行的放置,过程如图:

 对应的Java代码如下:

    //输入棋盘边长n,返回所有合法的放置位置
    public List> solveNQueens(int n)
    {
        //题目要求使用二维字符串数组返回
        List> res = new ArrayList<>();
        linkedList> board = new linkedList<>();
        backtrack(res,board,0,n);
        return res;
    }

    //按照题目要求初始化每行
    public List initList(int n)
    {
        List temp = new ArrayList<>();
        for(int j=0;j convertBoard(linkedList> board)
    {
        List res = new ArrayList<>();
        for(int i=0;i> res,linkedList> board,int y,int n)
    {
        if(board.size()>=n||y>=n)
        {
            res.add(convertBoard(board));
            return;
        }
        for(int i=0;i yList = initList(n);
            yList.set(i,"Q");
            board.add(yList);
            //处理下一行
            backtrack(res,board,y+1,n);
            //取消选择
            board.removeLast();
        }
    }

    public boolean isValid(linkedList> board,int x,int y,int n)
    {
        //检查上方是否有冲突
        for(int i=0;i=0;i++,j--)
        {
            if(board.get(j).get(i).equals("Q"))
                return false;
        }
        //检查左上方是否有冲突
        for(int i=x-1,j=y-1;i>=0&&j>=0;i--,j--)
        {
            if(board.get(j).get(i).equals("Q"))
                return false;
        }
        return true;
    }

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/759284.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号