文章目录

  • 前言
  • 题目
  • 详细题解
    • 写法1
    • 推导证明
  • 举一反三
  • 总结

前言

今天是经典的深度优先搜索问题,即八皇后问题。

作为经典问题,我发现了一种新的写法,不需要开二维数组即可完成。

题目

给定一个 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 6≤N≤13
输入样例:
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

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

  1. 【寒假每日一题】分巧克力(个人练习)详细题解+推导证明(第八天)附带转载程序员壁纸

    文章目录 前言 题目 详细题解 写法1 O(nlogn)O(nlogn)O(nlogn) 推导证明 举一反三 总结 前言 话说今天开始准备搞一个秋招的GitHub,算是复习一遍了. 今天还是寒假每日一 ...

  2. 【寒假每日一题】剪绳子(个人练习)详细题解+推导证明(第六天)

    文章目录 前言 题目 详细题解 写法1 O(nlogn)O(nlogn)O(nlogn) 推导证明 举一反三 总结 前言 今天终于出核酸检测的结果,还好大家都没事,不然怕是要封城了!!! 今天还是寒假 ...

  3. 【寒假每日一题】数字三角形(个人练习)详细题解+推导证明(第二天)

    文章目录 前言 题目 详细题解 写法1 O ( n 2 ) O(n^2) O(n2) 推导证明 写法2 O ( n 2 ) O(n^2) O(n2) 推导证明 举一反三 总结 前言 昨天真是人生中奇葩 ...

  4. 【寒假每日一题】找硬币(个人练习)详细题解+推导证明(第十二天)

    文章目录 前言 题目 详细题解 写法1 O ( n ) O(n) O(n) 推导证明 写法2 O ( n l o g n ) O(nlogn) O(nlogn) 推导证明 举一反三 总结 前言 这个寒 ...

  5. 【寒假每日一题】十三号星期五(个人练习)详细题解+推导证明(第十三天)

    文章目录 前言 题目 详细题解 写法1 O(n)O(n)O(n) 推导证明 举一反三 总结 前言 这一周的题,真的是很扎实的基础题. 今天的题目是来自usaco training 1.2. 最近在家呆 ...

  6. 【寒假每日一题】平方矩阵 II(个人练习)详细题解+推导证明(第十四天)

    文章目录 前言 题目 详细题解 写法1 O(n2)O(n^2)O(n2) 推导证明 写法2 O(n2)O(n^2)O(n2) 推导证明 写法3 O(n2)O(n^2)O(n2) 推导证明 举一反三 总 ...

  7. 2021寒假每日一题《献给阿尔吉侬的花束》

    献给阿尔吉侬的花束 题目来源:<信息学奥赛一本通> 时间限制: 1000 m s 1000ms 1000ms 内存限制: 64 m b 64mb 64mb 题目描述 阿尔吉侬是一只聪明又慵 ...

  8. 倪文迪陪你学蓝桥杯2021寒假每日一题:1.11日(2017省赛A第9题)

    2021年寒假每日一题,2017~2019年的省赛真题. 本文内容由倪文迪(华东理工大学计算机系软件192班)和罗勇军老师提供. 后面的每日一题,每题发一个新博文,请大家看博客目录:https://b ...

  9. AcWing寒假每日一题2058. 笨拙的手指

    AcWing寒假每日一题2058. 笨拙的手指 题目描述 奶牛贝茜正在学习如何在不同进制之间转换数字. 但是她总是犯错误,因为她无法轻易的用两个前蹄握住笔. 每当贝茜将数字转换为一个新的进制并写下结果 ...

最新文章

  1. 测试进度需要考虑的问题
  2. Cannot open the disk 'E:/vmware/Ubuntu.vmdk' or one of the snapshot disks it depends on. 解决方法
  3. leetcode-139-单词拆分
  4. 深度阅读之《Mastering Go》
  5. hdu--4028--dp
  6. meta http-equiv属性兼容浏览器_定时刷新
  7. 20145321 《Java程序设计》第4周学习总结
  8. Google+ 为什么会死?
  9. 在GridView分页过程中,CheckBox的选中状态不丢失
  10. Android 四大组件学习之Server一
  11. colspan会影响内部单元格宽度失效_冷轧轧辊失效原因分析及改进措施
  12. MPLAB PICKIT3、MPLAB SIM调试
  13. 中国移动互联网半年大报告解析
  14. html5 canvas 涂鸦画板
  15. STEINS;GATE ELITE(中文名《命运石之门:精英》)游戏通关流程
  16. 玩客云小盒子安装点心云,实现闲置宽带共享。
  17. Mac无法开机?如何修复并使其重新启动
  18. 基于Java的XXX管理系统的设计与实现——毕业设计题目
  19. ubuntu上安装QT
  20. vins-fusion gps融合相关总结

热门文章

  1. centos图形化界面安装,中文输入法,mysql安装
  2. Kubernetes安装及使用踩坑填坑大全【详细步骤】
  3. 相关滤波目标跟踪学习笔记(三)——KCF算法公式理解
  4. python frozenset_python中set和frozenset有什么异同?
  5. bind函数失败linux,为什么bind函数返回-1(绑定失败)?
  6. Dell R740服务器配置RAID5+1/RAID6 配置实战
  7. 嘿嘿,成功加到妹子微信!
  8. 靶场搭建-VMware网络配置
  9. HTTP响应码,大详解
  10. 如何查看服务器端口是否打开