Hard-题目18:51. N-Queens

本文介绍了一种使用回溯算法解决N皇后问题的方法,并提供了一个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’ and ‘.’ both indicate a queen and an empty space respectively.
题目大意:
给出n,输出N皇后问题的所有解。(别告诉我没做过八皇后,计算机专业的都懂得……)
题目分析:
使用回溯,每放一个皇后判断一下这个位置是否可以被之前的皇后吃掉,如果可以就继续放下去,然后搜索下一行,直到最后一行放上了皇后。
源码:(language:java)

public class Solution {
    public List<List<String>> solveNQueens(int n) {
        List<List<String>> list = new ArrayList<List<String>>();
        backtrack(n,0,list,new boolean[n][n]);
        return list;
    }
    private void backtrack(int n,int queens,List<List<String>> list,boolean[][] chessboard) {
        if(n==queens) {
            list.add(convert(chessboard,n));
        }
        else {
            for(int j = 0;j<n;j++) { // press a queen at chessboard[queens][j]
                boolean canPress = true;
                for(int s = 0;s<queens;s++) {
                    if(!canPress)
                        break;
                    for(int t = 0;t<n;t++) {
                        if(chessboard[s][t]) {
                            if(t==j || Math.abs(s-queens)==Math.abs(t-j)) {
                                canPress = false;
                                break;
                            }
                        }
                    }
                }
                if(canPress) {
                    chessboard[queens][j] = true;
                    backtrack(n, queens+1, list, chessboard);
                    chessboard[queens][j] = false;
                }
            }
        }
    }
    private List<String> convert(boolean[][] chessboard,int n) {
        List<String> list = new ArrayList<String>();
        for(int i = 0;i<n;i++) {
            String line = "";
            for(int j = 0;j<n;j++) {
                if(chessboard[i][j])
                    line+="Q";
                else
                    line+=".";
            }
            list.add(line);
        }
        return list;
    }
}

成绩:
31ms,beats 2.57%,众数6ms,19.35%
Cmershen的碎碎念:
本题成绩较差,一是没有进行任何剪枝,二是构造了辅助数组chessBoard存储棋盘,每找到一个解就遍历棋盘转换成题目要求的格式。这两点都是开销很大的。
另外在此感叹一下,八皇后是一道非常经典的回溯问题,可以说是当年学习C语言时的第一道坎。四年前当我们的计导课第一次讲到八皇后的问题时,那是一道很多人为之倾倒、乃至为之刷夜的难题,但如今却可以写出优雅的回溯。说明我们编程能力真的已经得到很大的提升了。

你遇到的错误: ```bash No package https://rdoproject.org/repos/openstack-queens/openstack-queens.repo available. Error: Nothing to do ``` --- ## ❌ 错误原因分析 你执行了这个命令: ```bash sudo yum install -y https://rdoproject.org/repos/openstack-queens/openstack-queens.repo ``` 这是 **错误的用法**! ### 🔴 `yum install` 不能直接安装 `.repo` 文件 虽然 `.repo` 是一个文本文件,但 `yum install` 只能安装 **RPM 包**,不能识别 `.repo` URL。 你传入的是一个 `.repo` 文件的地址(不是 RPM 包),所以 YUM 尝试把它当作“包名”去搜索 → 找不到 → 报错。 --- ## ✅ 正确做法:使用 `curl` 或 `wget` 下载 `.repo` 文件到 `/etc/yum.repos.d/` ### ✅ 正确步骤如下: ```bash # 1. 使用 curl 下载 OpenStack Queens 的 repo 文件 sudo curl -o /etc/yum.repos.d/openstack-queens.repo https://rdoproject.org/repos/openstack-queens/openstack-queens.repo # 2. 验证是否下载成功 ls -l /etc/yum.repos.d/openstack-queens.repo # 3. 查看内容确认 cat /etc/yum.repos.d/openstack-queens.repo ``` 你应该看到类似内容: ```ini [openstack-queens] name=OpenStack Queens Repository baseurl=https://mirror.centos.org/centos/7/cloud/$basearch/openstack-queens/ enabled=1 gpgcheck=1 gpgkey=https://www.centos.org/keys/RPM-GPG-KEY-CentOS-SIG-Cloud ``` > ⚠️ 注意:现在 `mirror.centos.org` 已经关闭!我们必须替换为可用镜像源! --- ## 🛠️ 关键修复:将 `.repo` 中的 `mirror.centos.org` 替换为阿里云镜像 因为原始 `openstack-queens.repo` 指向: ``` https://mirror.centos.org/centos/7/cloud/$basearch/openstack-queens/ ``` → ❌ 这个域名已经不可访问(CentOS 7 EOL) ### ✅ 解决方案:手动修改为阿里云镜像源 ```bash # 先删除原文件 sudo rm -f /etc/yum.repos.d/openstack-queens.repo # 创建新的 repo 文件,使用阿里云镜像 sudo tee /etc/yum.repos.d/openstack-queens.repo << 'EOF' [openstack-queens] name=OpenStack Queens - Alibaba Cloud Mirror baseurl=https://mirrors.aliyun.com/centos-altarch/7/cloud/x86_64/openstack-queens/ enabled=1 gpgcheck=1 gpgkey=https://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-SIG-Cloud EOF ``` > ✅ 阿里云维护了完整的 CentOS SIG Cloud 镜像,支持 OpenStack 各版本。 --- ## ✅ 清理缓存并重建元数据 ```bash # 清除所有旧缓存 sudo yum clean all # 删除缓存目录(避免残留无效数据) sudo rm -rf /var/cache/yum/* # 重建缓存 sudo yum makecache ``` ✅ 成功标志是出现: ``` Metadata Cache Created ``` --- ## ✅ 安装 packstack 现在可以正常安装: ```bash sudo yum install -y openstack-packstack ``` ✅ 成功安装后,验证: ```bash packstack --version ``` --- ## 💡 补充说明:其他 OpenStack 版本如何选择? | OpenStack 版本 | 命令(使用阿里云镜像) | |----------------|------------------------| | **Pike** | `baseurl=https://mirrors.aliyun.com/centos-altarch/7/cloud/x86_64/openstack-pike/` | | **Queens** | ✅ 推荐(当前最稳定兼容 CentOS 7) | | **Rocky** | `.../openstack-rocky/` (部分依赖可能不完整) | > ⚠️ 不推荐使用高于 Rocky 的版本(如 Stein、Train),它们已不再支持 CentOS 7。 --- ## ✅ 最终一键脚本(复制粘贴即可运行) ```bash # 1. 配置基础源(确保已完成) sudo curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo sudo yum install -y epel-release sudo curl -o /etc/yum.repos.d/epel.repo https://mirrors.aliyun.com/repo/epel-7.repo # 2. 配置 OpenStack Queens 源(阿里云镜像) sudo tee /etc/yum.repos.d/openstack-queens.repo << 'EOF' [openstack-queens] name=OpenStack Queens - Alibaba Cloud Mirror baseurl=https://mirrors.aliyun.com/centos-altarch/7/cloud/x86_64/openstack-queens/ enabled=1 gpgcheck=1 gpgkey=https://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-SIG-Cloud EOF # 3. 清理缓存 sudo yum clean all sudo rm -rf /var/cache/yum/* # 4. 重建缓存并安装 packstack sudo yum makecache sudo yum install -y openstack-packstack ``` 运行完成后,即可使用: ```bash packstack --allinone ``` 开始部署 OpenStack! ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值