N皇后问题

皇后问题:在一个由N2个方块排成N行N列的正方形,称为N元棋盘,在N元棋盘上放置N个皇后,如果某两个皇后位于N元棋盘的同一行或同一列或同一斜线(斜率为±1)上,则称它们在互相攻击,试设计算法找出使N个皇后互不攻击的所有布局。

在这个问题当中我们需要的是求出所有的组合情况我们需要采用回溯的方法。

首先我们设置好棋盘,然后我们在设置行,列,对角线和反对角线的值。

然后我们进行判断当我们放置的数量已经超过N的时候就退出,当我们搜索完所有的列的时候我们就退回到第一列并且行数加一也就是搜索完本行所有列后就去下一行的第一列开始搜索。当我们发现正好搜索到最后一行并且也正好放了n个皇后我们就可以输出结果了。

这个过程是利用行列对角线反对角线的值来进行判断的只有他们都为false表示他们都是安全的不会发生攻击的是可以放皇后的。然后就可以放置皇后并且再将他们的值设为true然后进行向下一列进行寻找去放置。

#include <stdio.h>
const int N = 20;        //设置最多20元棋盘
char m[N][N];    //棋盘
int n;        //n元棋盘
bool row[N], col[N], dj[N], udj[N];     //行,列,对角线,反对角线
void dfs(int x, int y, int s)
{
    if (s > n) return ;
    if (y == n) y = 0, x ++;
    if (x == n)
    {
        if (s == n)
        {
            for(int i = 0; i < n; i++) puts(m[i]);
            puts("");
        }
        return ;
    }
    //不放
    dfs(x, y + 1, s);
    //放

        if (!row[x] && !col[y] && !dj[x + y] && !udj[n + x - y])
        {
            m[x][y] = 'Q';
            row[x] = col[y] = dj[x + y] = udj[n + x - y] = true;
            dfs(x, y + 1, s + 1);  
            row[x] = col[y] = dj[x + y] = udj[n + x - y] = false;
            m[x][y] = '.';
        }

}
int main()
{
    printf("请输入是几元棋盘:\n");
    scanf("%d",&n);
    for(int i = 0; i < n; i++)
        for(int j = 0; j < n; j++)
            m[i][j] = '.';            //画棋盘
    dfs(0, 0, 0);    //从棋盘起点开始出发
    return 0;
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

用编程写诗

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值