[USACO1.5] 八皇后 Checker Challenge

题目描述

一个如下的 \(6 \times 6\) 的跳棋棋盘,有六个棋子被放置在棋盘上,使得每行、每列有且只有一个,每条对角线(包括两条主对角线的所有平行线)上至多有一个棋子。

上面的布局可以用序列 \(2\ 4\ 6\ 1\ 3\ 5\) 来描述,第 \(i\) 个数字表示在第 \(i\) 行的相应位置有一个棋子,如下:

行号 \(1\ 2\ 3\ 4\ 5\ 6\)

列号 \(2\ 4\ 6\ 1\ 3\ 5\)

这只是棋子放置的一个解。请编一个程序找出所有棋子放置的解。

并把它们以上面的序列方法输出,解按字典顺序排列。

请输出前 \(3\) 个解。最后一行是解的总个数。

输入格式

一行一个正整数 \(n\),表示棋盘是 \(n \times n\) 大小的。

输出格式

前三行为前三个解,每个解的两个数字之间用一个空格隔开。第四行只有一个数字,表示解的总数。

样例 #1

样例输入 #1

6

样例输出 #1

2 4 6 1 3 5
3 6 2 5 1 4
4 1 5 2 6 3
4

提示

【数据范围】

对于 \(100\%\) 的数据,\(6 \le n \le 13\)。

题目翻译来自NOCOW。

USACO Training Section 1.5

题目分析:

本题相当于需要找到棋盘内所有符合要求的皇后排列数,仔细观察就知道,一个N*N的棋盘最多只能摆下N个皇后,接下来就是找到所有合法的皇后排列,这是两个问题,合法,排列,先解决合法,摆下一个皇后之后如何才能知道这个位置是否合法,最简单的方法就是逐一检索前面摆下皇后的位置,判断前面摆下的皇后中有没有与该皇后在同一列或者同一对角线的皇后(不用判断是否在同一行,因为我们在编码的时候就是逐行放皇后的),是否在同一行=列只需要判断一下,两皇后位置的纵坐标是否相同即可,是否在同一对角线,很简单,在函数中满足y=x+b的都是在同一对角线的(x,y)的特点是他们坐标相减是同一个数,即斜率为1,公式(x1,y1),(x2,y2)有|x1-x2|=|y1-y2|,接下来就是求这几个皇后的全排列问题,我们在解决全排列问题的时候通常会使用dfs算法

看代码:

#include<iostream>
using namespace std;
int n, sum, a[110];
int awa(int h, int l) {
//h:行
//l:列
int i;
for (i = 1; i <= h - 1; i++)
//遍历前面每一行,也就是遍历前面已经摆好的皇后的编号
if ((l == a[i]) || (abs(h - i) == abs(l - a[i])))return 0;//判断是否在同一列或同一对角线
return 1;
}
void queen(int qwq) {
int i;
if (qwq > n) {
sum++;
if (sum <= 3) {//前三组输出
for (i = 1; i <= n; i++)cout << a[i] << " ";
cout << endl;
return;
}
else return;
}
for (i = 1; i <= n; i++) {
//我们用qwq也就是每个皇后的编号代表他们所在行的编号,逐个遍历每一列i
if (awa(qwq, i) == 1) {//当前皇后和前面的皇后不会互相攻击
a[qwq] = i;/*摆下当前皇后*/
queen(qwq + 1);/*继续来到下一列放置皇后*/
//记得要回溯,这是dfs求全排列方法
a[qwq] = 0;/*回溯*/
}
}
}
int main() {
cin >> n;
queen(1);
cout << sum << endl;
return 0;
}

八皇后dfs全排列——洛谷1219的更多相关文章

  1. LeetCode 31:递归、回溯、八皇后、全排列一篇文章全讲清楚

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天我们讲的是LeetCode的31题,这是一道非常经典的问题,经常会在面试当中遇到.在今天的文章当中除了关于题目的分析和解答之外,我们还会 ...

  2. 八皇后(DFS)

    题目描述 会下国际象棋的人都很清楚:皇后可以在横.竖.斜线上不限步数地吃掉其他棋子.如何将8个皇后放在棋盘上(有8 * 8个方格),使它们谁也不能被吃掉!这就是著名的八皇后问题. 对于某个满足要求的8 ...

  3. 洛谷 1219:八皇后 (位运算 & DFS)

    题目链接: https://www.luogu.org/problem/show?pid=1219#sub row:受上面的皇后通过列控制的位置 ld:受上面的皇后通过从右至左的斜对角线控制的位置 r ...

  4. 洛谷 - P1219 - 八皇后 - dfs

    https://www.luogu.org/problemnew/show/P1219 一开始朴素检查对角线就TLE了,给对角线编码之后压缩了13倍时间? 找了很久的bug居然是&&写 ...

  5. Tarjan 点双+割点+DFS【洛谷P3225】 [HNOI2012]矿场搭建

    P3225 [HNOI2012]矿场搭建 题目描述 煤矿工地可以看成是由隧道连接挖煤点组成的无向图.为安全起见,希望在工地发生事故时所有挖煤点的工人都能有一条出路逃到救援出口处.于是矿主决定在某些挖煤 ...

  6. 洛谷 p1219 八皇后

    刚参加完蓝桥杯 弱鸡错了好几道..回头一看确实不难 写起来还是挺慢的 于是开始了刷题的道路 蓝桥杯又名搜索杯 暴力杯...于是先从dfs刷起 八皇后是很经典的dfs问题 洛谷的这道题是这样的 上面的布 ...

  7. 洛谷 P1219 八皇后【经典DFS,温习搜索】

    P1219 八皇后 题目描述 检查一个如下的6 x 6的跳棋棋盘,有六个棋子被放置在棋盘上,使得每行.每列有且只有一个,每条对角线(包括两条主对角线的所有平行线)上至多有一个棋子. 上面的布局可以用序 ...

  8. 洛谷P1219 :八皇后(DFS+回溯)

    题目描述 检查一个如下的6 x 6的跳棋棋盘,有六个棋子被放置在棋盘上,使得每行.每列有且只有一个,每条对角线(包括两条主对角线的所有平行线)上至多有一个棋子. 上面的布局可以用序列2 4 6 1 3 ...

  9. 洛谷P1219 八皇后【dfs】

    题目描述 检查一个如下的6 x 6的跳棋棋盘,有六个棋子被放置在棋盘上,使得每行.每列有且只有一个,每条对角线(包括两条主对角线的所有平行线)上至多有一个棋子. 上面的布局可以用序列2 4 6 1 3 ...

  10. 【洛谷P1219 八皇后】

    参考思路见白书(一本通) 题目链接 题目描述 检查一个如下的6 x 6的跳棋棋盘,有六个棋子被放置在棋盘上,使得每行.每列有且只有一个,每条对角线(包括两条主对角线的所有平行线)上至多有一个棋子. 上 ...

随机推荐

  1. C# EF Core 后端代码已定义的用户实体,如何扩展字段?

    注:"2020中国.NET开发者大会"上学习到的开发技巧, 记录下来 1.问题 后端代码已定义的用户实体,如下: public class UserEntity { public ...

  2. 一文揭开JDK21虚拟线程的神秘面纱

    虚拟线程快速体验 环境:JDK21 + IDEA public static void main(String[] args) { try (var executor = Executors.newV ...

  3. DASCTF 2023六月挑战赛|二进制专项 PWN (上)

    DASCTF 2023六月挑战赛|二进制专项 PWN (上) 1.easynote edit函数对长度没有检查 free函数存在UAF漏洞 思路:1.通过堆溢出,UAF,修改size位达到堆块重叠,使 ...

  4. Python 实现行为驱动开发 (BDD) 自动化测试详解

    ​ 在当今的软件开发领域,行为驱动开发(Behavior Driven Development,BDD)作为一种新兴的测试方法,逐渐受到越来越多开发者的关注和青睐.Python作为一门功能强大且易于使 ...

  5. 【Java】匿名表达式 + 构造块

    来源自同事的一个代码截图 可以看见最后一行装填HashMap的语法非常的不常见 在我整理思绪之后才明白这语法是使用了 匿名内部类 + 对象构造代码块 一般使用场景是发生在容器对象的创建上,因为有些时候 ...

  6. 【微信小程序】05 设备信息 & 请求API

    获取系统信息(设备信息) https://developers.weixin.qq.com/miniprogram/dev/api/base/system/wx.getSystemInfo.html ...

  7. 【Scala】05 对象特性Part2

    特质重复继承关系 父类特质 A 子类特质B 继承 A 子类特质C 继承A 类D 继承了 B 又实现了 C class D extends B with C 继承顺序是 D 继承 C 继承 B 继承 A ...

  8. 【IDEA】回退操作记录

    参考自: https://www.cnblogs.com/zeussbook/p/9207970.html 找不到代码错误,又有很多已经写好的东西,不好全部删除 只要能记得确切的操作时间就行了 可以翻 ...

  9. 【转载】 新版 Kite为啥这么火,问就俩字『好用』

    本文转自: https://blog.csdn.net/qq_28168421/article/details/102927311 ---------------------------------- ...

  10. 使用 onNuxtReady 进行异步初始化

    title: 使用 onNuxtReady 进行异步初始化 date: 2024/8/16 updated: 2024/8/16 author: cmdragon excerpt: 摘要:本文详细介绍 ...