好长时间没登博客园了,今天想起了账号密码,遂发一篇题解

最近因为复赛正在复健搜索,所以做了这道题

这道题说难并不是很难,但是在于这个题需要找到两个规律

以下是原题

[USACO1.5]八皇后 Checker Challenge

题目描述

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

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

行号 1 2 3 4 5 6

列号 2 4 6 1 3 5

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

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

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

输入格式

一行一个正整数 n,表示棋盘是 n * 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<=n<=13

题目翻译来自NOCOW。

分析时间

我最初的1.0做法是dfs的参数枚举行,for枚举列

然后一输出,妙哉!

后来运行以后,发现输出了几万种可能。。。

怎么回事呢?

我们注意这样的一句不起眼的话

每条对角线(包括两条主对角线的所有平行线)上至多有一个棋子。

搜嘎,原来是这里没看见啊,意气风发の我翻开编译器,傻眼了:

我们应该怎样去判断到底是哪一行对角线呢?该怎么命名有规律呢?

我打开了画图,仔细的把样例画了出来



(哦,我这天才的审美)

研究了一下,发现左对角线(往左撇)和右对角线(往右撇)不能存放在一个数组里,需要用两个

于是用 lx[] 和 rx[] 来表示

聪明的人已经发现了规律

左对角线行列的和 -1 为 1~n*2-1 的编号

右对角线行 - 列 +n 为 1~n*2-1 的编号

注意:递归千万不要忘了回溯的时候恢复现场!!!

AC代码

#include<iostream>
#include<queue> using namespace std; int n,tot,cnt;
int a[15];
int q[15];
int lx[30];
int rx[30];
int l,r; void dfs(int t){
if(t>n){
cnt++;//计数
if(cnt<=3){
for(int i=1;i<=n;i++) cout<<q[i]<<" ";
cout<<endl;
}//输出
return ;//已经得出一个正解,返回
}
for(int i=1;i<=n;i++){
if(a[i]==0){
if(lx[i+t-1]!=0) continue;
if(rx[t-i+n]!=0) continue;
a[i]=1;
q[++tot]=i;
lx[i+t-1]=1;
rx[t-i+n]=1;
dfs(t+1);
tot--;//回溯
lx[i+t-1]=0;
rx[t-i+n]=0;
a[i]=0;
}
}
} int main(){
cin>>n;
dfs(1);
cout<<cnt;
}

感谢观看!!!ありがどう!

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

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

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

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

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

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

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

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

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

  5. 洛谷 P1219八皇后

    把全部,在这251秒,赌上! ——<游戏人生zero> 题目:https://www.luogu.org/problem/P1219 八皇后是一道非常非常非常经典的深搜+回溯的题目. 这道 ...

  6. P1219 八皇后

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

  7. 洛谷 p1219 八皇后

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

  8. P1219 八皇后 含优化 1/5

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

  9. 【搜索】P1219 八皇后

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

  10. 洛谷P1219 八皇后

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

随机推荐

  1. 易语言 CS1.6单机开源

    一个绘制 一个修改器 垃圾玩意 https://kxd.lanzoul.com/iJiwf07ve61a https://kxd.lanzoul.com/iTT4n07w61tg

  2. 【KAWAKO】MobaXterm-使用MobaSSHTunnel进行端口映射

    目录 在Tools中打开MobaSSHTunnel(port forwarding) 点击New SSH tunnel 配置信息 点击运行 访问端口 在Tools中打开MobaSSHTunnel(po ...

  3. CF1358D The Best Vacation

    题目传送门 思路 做这道题主要是需要发现一个性质:选择的区间必定是从某一个月的最后一天开始往前连续的一段区间. 考虑如何证明这个结论,设这个月有 \(x\) 天,假设有更优的方案满足到下一个月的第 \ ...

  4. Vulhub 漏洞学习之:Apache HTTPD

    Vulhub 漏洞学习之:Apache HTTPD 目录 Vulhub 漏洞学习之:Apache HTTPD 1 Apache HTTPD 换行解析漏洞(CVE-2017-15715) 1.1 漏洞利 ...

  5. 重磅!flink-table-store 将作为独立数据湖项目重新加入 Apache

    数据湖是大数据近年来的网红项目,大家熟知的开源数据湖三剑客 Apache hudi.Apache iceberg .Databricks delta 近年来野蛮生长,目前各自背后也都有商业公司支持,投 ...

  6. java-jdbc-druid

    0.简介 Java数据库连接,(Java Database Connectivity,简称JDBC)是Java语言中用来规范客户端程序如何来访问数据库的应用程序接口,提供了诸如查询和更新数据库中数据的 ...

  7. Compiler25th005: Excel Compiler

    Excel Compiler XCell Compiler, also known as Excel Compiler, offers very strong and hassle free Micr ...

  8. vue开发中,数据更新,但视图不刷新

    我们在开发过程中会碰到数据更新,但是视图并未改变的情况,情况如下: 第一种:动态给对象新增属性或者删除属性是不会触发视图刷新的,Vue识别不到: 第二种:通过数组下标修改数组中的元素或者手动修改数组的 ...

  9. tasklist

    tasklist是windows下列出进程信息的指令,可配合taskKill来关毕进程 https://learn.microsoft.com/zh-cn/windows-server/adminis ...

  10. php 实现CURL请求接口

    $ch = curl_init (); //初始化 @curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 跳过证书检查 @curl_setopt($ ...