【寒假每日一题】棋盘挑战(个人练习)详细题解+推导证明(第十六天)

前言

今天是经典的深度优先搜索问题,即八皇后问题。
在这里插入图片描述
作为经典问题,我发现了一种新的写法,不需要开二维数组即可完成。

题目

给定一个 N×N 的棋盘,请你在上面放置 N 个棋子,要求满足:

每行每列都恰好有一个棋子
每条对角线上都最多只能有一个棋子

    1   2   3   4   5   6
  -------------------------
1 |   | O |   |   |   |   |
  -------------------------
2 |   |   |   | O |   |   |
  -------------------------
3 |   |   |   |   |   | O |
  -------------------------
4 | O |   |   |   |   |   |
  -------------------------
5 |   |   | O |   |   |   |
  -------------------------
6 |   |   |   |   | O |   |
  -------------------------

上图给出了当 N=6 时的一种解决方案,该方案可用序列 2 4 6 1 3 5 来描述,该序列按顺序给出了从第一行到第六行,每一行摆放的棋子所在的列的位置。

请你编写一个程序,给定一个 N×N 的棋盘以及 N 个棋子,请你找出所有满足上述条件的棋子放置方案。

输入格式

  • 共一行,一个整数 N。

输出格式

  • 共四行,前三行每行输出一个整数序列,用来描述一种可行放置方案,序列中的第 i 个数表示第 i 行的棋子应该摆放的列的位置。
  • 这三行描述的方案应该是整数序列字典序排在第一、第二、第三的方案。
  • 第四行输出一个整数,表示可行放置方案的总数。

数据范围

  • 6 ≤ N ≤ 13 6≤N≤13 6N13
输入样例:
6
输出样例:
2 4 6 1 3 5
3 6 2 5 1 4
4 1 5 2 6 3
4

详细题解

写法1

#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

const int N = 15;

int n;
bool col[N], dg[N*2], udg[N*2];
int path[N], ans;

void dfs(int x)
{
    if(x > n)
    {
        ++ ans;
        if (ans <= 3)
        {
            for (int i = 1; i <= n; ++ i )
                cout << path[i] << " ";
            cout << endl;
        }
        return ;
    }
    
    for (int y = 1; y <= n; ++ y )
        if (!col[y] && !dg[x - y + n] && !udg[x + y])
        {
            path[x] = y;
            col[y] = dg[x - y + n] = udg[x + y] = true;
            dfs(x + 1);
            
            path[x] = 0;
            col[y] = dg[x - y + n] = udg[x + y] = false;
        }
}

int main()
{
    cin >> n;
    dfs(1);
    cout << ans << endl;
    
    return 0;
}

毫无疑问,这是我个人觉得很有想象力的一种写法,使用新的表示方法来表示对角线,真的是天马行空。

最后提交,AC😁
在这里插入图片描述

推导证明

首先是上下左右对角线都有特殊要求,比如该行和该列只能有自己。
在这里插入图片描述
其次是对角线不能有棋子,所以该方法使用两个数组和额外的表达式来表示。
在这里插入图片描述
最后是回溯问题,由于深度搜索的可能性较多,所以需要回溯到上一步,即没有任何干扰,俗称恢复现场。

举一反三

类似的回溯问题。

总结

继续努力,坚持更新,16th打卡。
在这里插入图片描述

我是管小亮 CSDN认证博客专家 TensorFlow PyTorch 图像处理
纸上得来终觉浅,绝知此事要躬行

包括但不局限于机器学习,深度学习,自然语言处理,计算机视觉,知识图谱,还有Python,C++,TensorFlow,Pytorch,Keras,PaddlePaddle等,不定时分享资源(电子书/项目/工具),学习路线,思考,面经等!!!
已标记关键词 清除标记
相关推荐
<p> <strong><span style="font-size:20px;color:#FF0000;">本课程主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的Java学习者</span></strong> </p> <p> <span style="color:#FF0000;"><strong><span style="font-size:18px;">1. 包含:<span style="color:#FFFF00;background-color:#FF0000;">项目源码、</span><span style="color:#FFFF00;background-color:#FF0000;">项目文档、数据库脚本、软件工具</span>等所有资料</span></strong></span> </p> <p> <span style="color:#FF0000;"><strong><span style="font-size:18px;">2. 手把手的带你从零开始部署运行本套系统</span></strong></span> </p> <p> <span style="color:#FF0000;"><strong><span style="font-size:18px;">3. 该项目附带的源码资料可作为毕设使用</span></strong></span> </p> <p> <span style="color:#FF0000;"><strong><span style="font-size:18px;">4. 提供技术答疑和远程协助指导</span></strong></span><strong><span style="font-size:18px;"></span></strong> </p> <p> <br /> </p> <p> <span style="font-size:18px;"><strong>项目运行截图:</strong></span> </p> <p> <strong><span style="font-size:18px;">1)系统登陆界面</span></strong> </p> <p> <strong><span style="font-size:18px;"><img src="https://img-bss.csdn.net/202002241015433522.png" alt="" /><br /> </span></strong> </p> <p> <strong><span style="font-size:18px;"><strong><span style="font-size:18px;">2)学生模块</span></strong></span></strong> </p> <p> <strong><span style="font-size:18px;"><img src="https://img-bss.csdn.net/202002241015575966.png" alt="" /></span></strong> </p> <p> <strong><span style="font-size:18px;"><strong><span style="font-size:18px;">3)教师模块</span></strong></span></strong> </p> <p> <strong><span style="font-size:18px;"><img src="https://img-bss.csdn.net/202002241016127898.png" alt="" /></span></strong> </p> <p> <strong><span style="font-size:18px;"><strong><span style="font-size:18px;">4)系统管理员</span></strong></span></strong> </p> <p> <strong><span style="font-size:18px;"><img src="https://img-bss.csdn.net/202002241016281177.png" alt="" /></span></strong> </p> <p> <strong><span style="font-size:18px;"><img src="https://img-bss.csdn.net/202002241016369884.png" alt="" /></span></strong> </p> <p> <strong><span style="font-size:18px;"><br /> </span></strong> </p> <p> <strong><span style="font-size:18px;"><strong><span style="font-size:18px;">更多Java毕设项目请关注我的毕设系列课程 <a href="https://edu.csdn.net/lecturer/2104">https://edu.csdn.net/lecturer/2104</a></span></strong></span></strong> </p> <p> <strong><span style="font-size:18px;"><br /> </span></strong> </p>
©️2020 CSDN 皮肤主题: 酷酷鲨 设计师:CSDN官方博客 返回首页