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

上面的布局可以用序列2 4 6 1 3 5来描述,第i个数字表示在第i行的相应位置有一个棋子,如下:
行号 1 2 3 4 5 6
列号 2 4 6 1 3 5
这只是跳棋放置的一个解。请编一个程序找出所有跳棋放置的解。并把它们以上面的序列方法输出。解按字典顺序排列。请输出前3个解。最后一行是解的总个数。
//以下的话来自usaco官方,不代表洛谷观点
特别注意: 对于更大的N(棋盘大小N x N)你的程序应当改进得更有效。不要事先计算出所有解然后只输出(或是找到一个关于它的公式),这是作弊。如果你坚持作弊,那么你登陆USACO Training的帐号删除并且不能参加USACO的任何竞赛。我警告过你了!
输入输出格式
输入格式:
一个数字N (6 <= N <= 13) 表示棋盘是N x N大小的。
输出格式:
前三行为前三个解,每个解的两个数字之间用一个空格隔开。第四行只有一个数字,表示解的总数。
输入输出样例
6
2 4 6 1 3 5
3 6 2 5 1 4
4 1 5 2 6 3
4
说明
题目翻译来自NOCOW。
USACO Training Section 1.5
一道硬生生的DFS(当然也是DFS中比较经典的了吧QwQ)
基本思路如下:
首先一看,n≤13,嗯,是打表DFS没错了
那么,我们应该如何的去DFS呢?
首先,我们需要开一些名叫abcd的数组存东西
a数组需要存的是第i个皇后所占的列;
b数组(bool类型)表示的是第i列有没有被占;
c数组(bool类型)表示的是对角线(/)有没有被占;
d数组(bool类型)表示的是对角线(\)有没有被占;
那么,就可以初步确定下来如何去DFS
其实思路十分的简单
只需要在确定每一个皇后之前都判断一下每一步是否可走就行了(显然我们一行放一个)
因为要输出前3组数据,所以这里不得不需要回溯
但还要控制输出组数为3
所以下放代码(显示行号以表友好):
#include<bits/stdc++.h> using namespace std; bool d[],b[],c[];
int sum,a[],n; inline int read()//快速读入
{
int X=,w=;
char c=getchar();
while(c<''||c>'')
{
if (c=='-')
{
w=-;
}
c=getchar();
}
while(c>=''&&c<='')
{
X=(X<<)+(X<<)+c-'';
c=getchar();
}
return X*w;
} inline void out(int n)//快速输出
{
if(n>=)
{
out(n/);
}
putchar(n%+'');
} inline int print()//输出答案
{
sum++;
if(sum<=)//控制输出组数
{
for(int i=;i<=n;i++)//输出每组的答案
{
out(a[i]);
printf(" ");
}
printf("\n");
}
} inline void search(int i)//DFS
{
if(i>n)//判断边界条件
{
print();
return;
}
else
{
int j;
for(j=;j<=n;j++)//一波for
{
if((!b[j])&&(!c[i+j])&&!(d[i-j+n]))//需要保证该列,该左对角线和该右对角线全都没有另一个皇后
{
a[i]=j;//存一下答案
b[j]=;//占领第j列
c[i+j]=;//占领对角线"/"
d[i-j+n]=;//占领对角线"\"
search(i+);//递归的DFS
b[j]=;//回溯
c[i+j]=;//回溯
d[i-j+n]=;//回溯
}
}
} } int main()
{
n=read();//读入
search();//从1开始DFS
out(sum);//输出答案组数
return ;
}
非常漂亮
【洛谷P1219 八皇后】的更多相关文章
- 洛谷 P1219 八皇后【经典DFS,温习搜索】
P1219 八皇后 题目描述 检查一个如下的6 x 6的跳棋棋盘,有六个棋子被放置在棋盘上,使得每行.每列有且只有一个,每条对角线(包括两条主对角线的所有平行线)上至多有一个棋子. 上面的布局可以用序 ...
- 洛谷 P1219八皇后
把全部,在这251秒,赌上! ——<游戏人生zero> 题目:https://www.luogu.org/problem/P1219 八皇后是一道非常非常非常经典的深搜+回溯的题目. 这道 ...
- 洛谷 p1219 八皇后
刚参加完蓝桥杯 弱鸡错了好几道..回头一看确实不难 写起来还是挺慢的 于是开始了刷题的道路 蓝桥杯又名搜索杯 暴力杯...于是先从dfs刷起 八皇后是很经典的dfs问题 洛谷的这道题是这样的 上面的布 ...
- 洛谷P1219 八皇后【dfs】
题目描述 检查一个如下的6 x 6的跳棋棋盘,有六个棋子被放置在棋盘上,使得每行.每列有且只有一个,每条对角线(包括两条主对角线的所有平行线)上至多有一个棋子. 上面的布局可以用序列2 4 6 1 3 ...
- 洛谷 P1219 八皇后题解
题目描述 检查一个如下的6 x 6的跳棋棋盘,有六个棋子被放置在棋盘上,使得每行.每列有且只有一个,每条对角线(包括两条主对角线的所有平行线)上至多有一个棋子. 上面的布局可以用序列2 4 6 1 3 ...
- 洛谷P1219 八皇后
题目描述 检查一个如下的6 x 6的跳棋棋盘,有六个棋子被放置在棋盘上,使得每行.每列有且只有一个,每条对角线(包括两条主对角线的所有平行线)上至多有一个棋子. 上面的布局可以用序列2 4 6 1 3 ...
- 洛谷 - P1219 - 八皇后 - dfs
https://www.luogu.org/problemnew/show/P1219 一开始朴素检查对角线就TLE了,给对角线编码之后压缩了13倍时间? 找了很久的bug居然是&&写 ...
- 洛谷P1219 八皇后 我。。。。。。
代码1 (学弟版) #include<bits/stdc++.h>using namespace std;int l[15];bool s[15]; ...
- 洛谷P2105 K皇后
To 洛谷.2105 K皇后 题目描述 小Z最近捡到了一个棋盘,他想在棋盘上摆放K个皇后.他想知道在他摆完这K个皇后之后,棋盘上还有多少了格子是不会被攻击到的. (Ps:一个皇后会攻击到这个皇后所在的 ...
随机推荐
- numpy数组的运算
numpy数组的运算 数组的乘法 >>> import numpy as np >>> arr=np.array([[1,2,3],[4,5,6]]) >&g ...
- HeidiSQL
相关链接 https://www.heidisql.com/ - 官网 https://github.com/HeidiSQL/HeidiSQL - 源码 参考 ...
- 实现webpack的实时打包构建
1. 由于每次重新修改代码之后,都需要手动运行webpack打包的命令,比较麻烦,所以使用`webpack-dev-server`来实现代码实时打包编译,当修改代码之后,会自动进行打包构建.2. 运行 ...
- Ubuntu 增加新用户并赋予root权限及免密的方法
添加用户 添加一个名为hylink的用户 adduser hylink 修改密码 passwd hylink Changing password for user hylink. New UNIX p ...
- Solr知识点摘录
1.Solr和Lucene区别: 2.Solr的下载与安装 3. 4. 5. 6.Solr基础 7. 8.Solr索引操作 9. 10.
- rest_framework框架的分页
class MyPageNumberPagination(PageNumberPagination): page_size = 1 page_query_param = 'page' page_siz ...
- thinkphp5 select对象怎么转数组?
DB操作返回是数组.模型直接操作返回是对象 对象类型转换数组打开 database.php 增加或修改参数'resultset_type' => '\think\Collection',即可连贯 ...
- Docker介绍,安装和常用的命令
Docker是Google公司推出的Go语言开发的,基于Linux内核的cgroup,namespace,AUFS类的UnionFS等技术.对进程进行封装格力,属于操作系统层面的虚拟化技术.隔离的进程 ...
- php内置函数分析之array_column()
PHP_FUNCTION(array_column) { zval *zcolumn = NULL, *zkey = NULL, *data; HashTable *arr_hash; zval *z ...
- DDD领域驱动设计初探(四):WCF搭建
前言:前面三篇分享了下DDD里面的两个主要特性:聚合和仓储.领域层的搭建基本完成,当然还涉及到领域事件和领域服务的部分,后面再项目搭建的过程中慢慢引入,博主的思路是先将整个架构走通,然后一步一步来添加 ...