【寒假每日一题】棋盘挑战(个人练习)详细题解+推导证明(第十六天)
文章目录
- 前言
- 题目
- 详细题解
- 写法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 O(nlogn)O(nlogn)O(nlogn) 推导证明 举一反三 总结 前言 话说今天开始准备搞一个秋招的GitHub,算是复习一遍了. 今天还是寒假每日一 ...
- 【寒假每日一题】剪绳子(个人练习)详细题解+推导证明(第六天)
文章目录 前言 题目 详细题解 写法1 O(nlogn)O(nlogn)O(nlogn) 推导证明 举一反三 总结 前言 今天终于出核酸检测的结果,还好大家都没事,不然怕是要封城了!!! 今天还是寒假 ...
- 【寒假每日一题】数字三角形(个人练习)详细题解+推导证明(第二天)
文章目录 前言 题目 详细题解 写法1 O ( n 2 ) O(n^2) O(n2) 推导证明 写法2 O ( n 2 ) O(n^2) O(n2) 推导证明 举一反三 总结 前言 昨天真是人生中奇葩 ...
- 【寒假每日一题】找硬币(个人练习)详细题解+推导证明(第十二天)
文章目录 前言 题目 详细题解 写法1 O ( n ) O(n) O(n) 推导证明 写法2 O ( n l o g n ) O(nlogn) O(nlogn) 推导证明 举一反三 总结 前言 这个寒 ...
- 【寒假每日一题】十三号星期五(个人练习)详细题解+推导证明(第十三天)
文章目录 前言 题目 详细题解 写法1 O(n)O(n)O(n) 推导证明 举一反三 总结 前言 这一周的题,真的是很扎实的基础题. 今天的题目是来自usaco training 1.2. 最近在家呆 ...
- 【寒假每日一题】平方矩阵 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) 推导证明 举一反三 总 ...
- 2021寒假每日一题《献给阿尔吉侬的花束》
献给阿尔吉侬的花束 题目来源:<信息学奥赛一本通> 时间限制: 1000 m s 1000ms 1000ms 内存限制: 64 m b 64mb 64mb 题目描述 阿尔吉侬是一只聪明又慵 ...
- 倪文迪陪你学蓝桥杯2021寒假每日一题:1.11日(2017省赛A第9题)
2021年寒假每日一题,2017~2019年的省赛真题. 本文内容由倪文迪(华东理工大学计算机系软件192班)和罗勇军老师提供. 后面的每日一题,每题发一个新博文,请大家看博客目录:https://b ...
- AcWing寒假每日一题2058. 笨拙的手指
AcWing寒假每日一题2058. 笨拙的手指 题目描述 奶牛贝茜正在学习如何在不同进制之间转换数字. 但是她总是犯错误,因为她无法轻易的用两个前蹄握住笔. 每当贝茜将数字转换为一个新的进制并写下结果 ...
最新文章
- 测试进度需要考虑的问题
- Cannot open the disk 'E:/vmware/Ubuntu.vmdk' or one of the snapshot disks it depends on. 解决方法
- leetcode-139-单词拆分
- 深度阅读之《Mastering Go》
- hdu--4028--dp
- meta http-equiv属性兼容浏览器_定时刷新
- 20145321 《Java程序设计》第4周学习总结
- Google+ 为什么会死?
- 在GridView分页过程中,CheckBox的选中状态不丢失
- Android 四大组件学习之Server一
- colspan会影响内部单元格宽度失效_冷轧轧辊失效原因分析及改进措施
- MPLAB PICKIT3、MPLAB SIM调试
- 中国移动互联网半年大报告解析
- html5 canvas 涂鸦画板
- STEINS;GATE ELITE(中文名《命运石之门:精英》)游戏通关流程
- 玩客云小盒子安装点心云,实现闲置宽带共享。
- Mac无法开机?如何修复并使其重新启动
- 基于Java的XXX管理系统的设计与实现——毕业设计题目
- ubuntu上安装QT
- vins-fusion gps融合相关总结