《程序设计与算法(二)算法基础》《第二周 递归》N皇后问题

https://www.cnblogs.com/franknihao/p/9416145.html

 

问题: 国际象棋棋盘是8 * 8的方格,每个方格里放一个棋子。皇后这种棋子可以攻击同一行或者同一列或者斜线(左上左下右上右下四个方向)上的棋子。

在一个棋盘上如果要放八个皇后,使得她们互相之间不能攻击(即任意两两之间都不同行不同列不同斜线),求出一种(进一步的,所有)布局方式。

复制代码
/*
Recurse
N Queens problem
*/
#include<iostream>
#include<cmath>
using namespace std;

void NQueen(int k);
int N;
//用来存放算好的皇后位置。最左上角是(0,0)
int queenPos[100];

int main()
{
    cin >> N;
    NQueen(0); //从第 0 行开始摆皇后

    return 0;
}
// 在 0~k 1 行皇后已经摆好的情况下,摆第 k 行及其后的皇后
void NQueen(int k)
{
    
    int i;
    if (k == N) // N 个皇后已经摆好
    {
        for (i = 0; i < N; i++)
        {
            cout << queenPos[i] + 1<<" ";
        }
        cout << endl;
        return;
        
    }
    // 逐尝试第 k 个皇后的位置
    // 0~N 列遍历 ,第K行皇后应该放在第几列
    for (i = 0; i < N; i++)
    {
        int j;
        for (j = 0; j < k; j++)
        {
            
            // 和已经摆好的 k 个皇后的位置比较,看是否冲突
            // 1. 不能在同一列
            // 2. 不能在对角线上,即 行间距  != 列间距 
            if (queenPos[j] == i || abs(k - j) == abs(i - queenPos[j]))
            {
                break; //冲突,则试下一个位置
            }
        }
        if (j == k) // 当前选的位置 i 不冲突
        {
            queenPos[k] = i; //将第 k 个皇后摆放在位置 i
            NQueen(k + 1);
        }
    }
}
复制代码

 

posted @   清风oo  阅读(220)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
历史上的今天:
2018-08-25 2018第一次抢春运火车票经验总结
点击右上角即可分享
微信分享提示