[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

(一)读懂题目

(Who) 关键词

6×6棋盘
六个棋子
每行、每列
每条对角线
只有一个

(What) 关键词之间关键联系:

满足每行每列每个对角线只有一个棋子的棋局就是一种解法

(How) 思路:

(1)

分析:第一反应使用深度优先搜索去做,枚举每一行,对本次摆放的棋子的每一列和每一个对角线都标上记号

(2)

分析:我们可以运用标记数组,bool类型来进行标记

(3)

分析:重要的是对角线的标记问题,但经过观察可以发现,对角线不是i+j相等就是i-j+8相等,所以可以利用这个特性来进行标记

(二)分析时间+空间复杂度

时间复杂度:O(n)
空间复杂度:O(n)

(三)代码实现

#include<iostream>
#include<cstdio>
using namespace std;
int ans,n;//ans是用来记录输出次数,题目只要求输出3次
int a[15];//每一行
bool b[15],c[40],d[40];//标记数组,b数组标记那一列,c和d数组标记对角线
void print()//打印函数
{
for(int j=1;j<=n;j++)
{
printf("%d ",a[j]);
}
puts("");
return;
}
void dfs(int i)//重点:深搜dfs
{
if(i>n)//如果一种情况成立(i已经遍历完每一列所有位置)
{
ans++;//记录+1
if(ans<=3)//如果<=3才输出,否则就是+1而已
{
print();
}
return;
}
for(int j=1;j<=n;j++)//枚举每一列
{
if(!b[j]&&!c[i+j]&&!d[i-j+n])//如果这个点没有被其他皇后给攻击到
{
//标记ing ……
b[j]=true;
c[i+j]=true;
d[i-j+n]=true;
a[i]=j;
dfs(i+1);//继续深搜
//取消标记,回溯ing……
b[j]=false;
c[i+j]=false;
d[i-j+n]=false;
}
}
return;
}
int main(){
scanf("%d",&n);
dfs(1);//记得从1开始
printf("%d\n",ans);
return 0;
}

(四)总结反思

本题就是著名的八皇后问题,最初由国际西洋棋棋手马克斯·贝瑟尔于1848年提出的问题,是回溯算法的典型案例。
然后就是被许多人又改成了许多版本(N皇后、K皇后、皇后游戏、还是N皇后)……
呃,正事——
本题考察的是我们对与搜索的掌握,但对于本题而言,深搜dfs的回溯还是更适合枚举方案的
所以最后也是运用了dfs进行作答
AC~

[USACO1.5] 八皇后 Checker Challenge 题解的更多相关文章

  1. P1219 [USACO1.5]八皇后 Checker Challenge

    好长时间没登博客园了,今天想起了账号密码,遂发一篇题解 最近因为复赛正在复健搜索,所以做了这道题 这道题说难并不是很难,但是在于这个题需要找到两个规律 以下是原题 [USACO1.5]八皇后 Chec ...

  2. USACO1.5 Checker Challenge(类n皇后问题)

    B - B Time Limit:1000MS     Memory Limit:16000KB     64bit IO Format:%lld & %llu   Description E ...

  3. 『嗨威说』算法设计与分析 - 回溯法思想小结(USACO-cha1-sec1.5 Checker Challenge 八皇后升级版)

    本文索引目录: 一.回溯算法的基本思想以及个人理解 二.“子集和”问题的解空间结构和约束函数 三.一道经典回溯法题点拨升华回溯法思想 四.结对编程情况 一.回溯算法的基本思想以及个人理解: 1.1 基 ...

  4. USACO 1.5.4 Checker Challenge跳棋的挑战(回溯法求解N皇后问题+八皇后问题说明)

    Description 检查一个如下的6 x 6的跳棋棋盘,有六个棋子被放置在棋盘上,使得每行,每列,每条对角线(包括两条主对角线的所有对角线)上都至多有一个棋子. 列号 0 1 2 3 4 5 6 ...

  5. TZOJ 3522 Checker Challenge(深搜)

    描述 Examine the 6x6 checkerboard below and note that the six checkers are arranged on the board so th ...

  6. USACO 6.5 Checker Challenge

    Checker Challenge Examine the 6x6 checkerboard below and note that the six checkers are arranged on ...

  7. [OpenJudge] 百练2754 八皇后

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

  8. 【算法导论】八皇后问题的算法实现(C、MATLAB、Python版)

    八皇后问题是一道经典的回溯问题.问题描述如下:皇后可以在横.竖.斜线上不限步数地吃掉其他棋子.如何将8个皇后放在棋盘上(有8*8个方格),使它们谁也不能被吃掉?         看到这个问题,最容易想 ...

  9. 洛谷 p1219 八皇后

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

  10. 【搜索】P1219 八皇后

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

随机推荐

  1. [oeasy]python0019_ 打包和解包_struct_pack_unpack

    ​ 打包和解包 回忆上次内容 ASCII 由这样几类字符构成 英文大写字符 英文小写字符 数字 符号 电报时代对于英文.数字的编码 使用的是摩斯电码 ​ 编辑 这摩斯电码是3进制的编码方式 长短空 怎 ...

  2. [oeasy]python0010 - python虚拟机解释执行py文件的原理

    ​ 解释运行程序 回忆上次内容 我们这次设置了断点 设置断点的目的是更快地调试 调试的目的是去除​​bug​​ 别害怕​​bug​​ 一步步地总能找到​​bug​​ 这就是程序员基本功 调试​​deb ...

  3. 分析C语言程序

    1 #include <stdio.h> 2 int main() 3 { 4 puts("C语言"); 5 return 0; 6 } 函数的概念 C语言提供了很多功 ...

  4. Vue 给mapState中定义的属性赋值报错的解决方案

    Vue 给mapState中定义的属性赋值报错的解决方案 by:授客 QQ:1033553122 1.   实践环境 Vue 2.9.6 2.   问题描述 <script> import ...

  5. 老旧 Linux 系统搭建现代 C++ 开发环境 —— 基于 neovim

    问题背景 公司配发的电脑是 macOS,日常开发需要访问 Linux 虚拟机,出于安全方面的考虑,只能通过跳板机登录.这阻止了大多数远程图形界面的使用,让写代码的工作变得复杂起来,市面上非常好用的 V ...

  6. 在 Hub 上使用 Presidio 进行自动 PII 检测实验

    我们在 Hugging Face Hub 上托管的机器学习 (ML) 数据集中发现了一个引人关注的现象: 包含个人未经记录的私密信息.这一现象为机器学习从业者带来了一些特殊挑战. 在本篇博客中,我们将 ...

  7. 《最新出炉》系列初窥篇-Python+Playwright自动化测试-62 - 判断元素是否可操作

    1.简介 有些页面元素的生命周期如同流星一闪,昙花一现.我们也不知道这个元素在没在页面中出现过,为了捕获这一美好瞬间,让其成为永恒.我们就来判断元素是否显示出现过. 在操作元素之前,可以先判断元素的状 ...

  8. 使用Cython调用CUDA Kernel函数

    技术背景 前面写过一篇关于Cython和C语言混合编程的文章,在Cython中可以使用非常Pythonic的方法去调用C语言中的函数.另外我们也曾在文章中介绍过Python中使用CUDA计算的一种方案 ...

  9. 对比python学julia(第一章)--(第二节)似曾相识燕归来

    Julia和python一样,都是跨平台开源语言,而且都是动态语言,所以毫无疑问,需要运行时支撑.很简单,到官网去下载julia(https://julialang.org/downloads/).和 ...

  10. Windows11重置后出现Windows.old文件夹无法删除,报错C:\Windows.old\WINDOWS\System32\WDI - 目录不是空的。Win11系统Windows.old能删除吗?Windows.old怎么删

    问题: Windows11重置后出现Windows.old文件夹无法删除,报错C:\Windows.old\WINDOWS\System32\WDI - 目录不是空的. 网上的各种方法均不奏效: ht ...