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大小的。

输出格式:

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

输入输出样例

输入样例#1:

6
输出样例#1:

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

题目链接:https://www.luogu.org/problem/show?pid=1219

分析:

显然问题的关键在于如何判定某个皇后所在的行,列,斜线上是否有别的皇后;可以从矩阵的特点上找到规律,如果在同一行,则行号相同;如果在同一列上,则列号相同;如果同在/ 斜线上的行列值之和相同;如果同在\ 斜线上的行列值之差相同

考虑每一行只能有一个皇后(根据题意同行不能有两个皇后)我们可以建立一个ans[]数组来储存每个皇后的位置ans[i]下表i代表行数内容代表列数

另外根据我们找到的规律可以建立a[],b[],c[],d[]四个数组分别用来标记对角线的四个方向,我们可以使用回溯算法放置皇后时对该皇后的行列对角线进行占用标记。一种方案执行完后,再释放标记!

此题采用的是一维数组操作,使问题变得更加容易理解!

下面给出AC代码:

 #include <bits/stdc++.h>
using namespace std;
const int maxn=;
typedef long long ll;
int a[maxn],b[maxn],c[maxn],d[maxn],ans[maxn],n,tim=;
inline void print()
{
if(tim<)
{
for(int i=;i<n;i++)
cout<<ans[i]<<" ";
cout<<ans[n]<<endl;
}
++tim;
return;
}
inline int DFS(int k)//深度优先搜索,k指代接下去放的是第k个棋子
{
if(k>n)
print();
else
{
for(int i=;i<=n;i++)
{
if(a[i]==&&b[i]==&&c[i-k]==&&d[i+k]==)//判断行列对角线是否可以放
{
a[i]=;
b[i]=;
c[i-k]=;
d[i+k]=;
ans[k]=i;
DFS(k+);//搜索下一个棋子的位置
a[i]=;
b[i]=;
c[i-k]=;
d[i+k]=;
}
continue;
}
}
}
int main()
{
scanf("%d",&n);
DFS();
printf("%d",tim);
return ;
}

洛谷 P1219 八皇后【经典DFS,温习搜索】的更多相关文章

  1. 洛谷P1219 八皇后【dfs】

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

  2. 洛谷 P1219八皇后

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

  3. 洛谷 p1219 八皇后

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

  4. 【洛谷P1219 八皇后】

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

  5. 洛谷 P1219 八皇后题解

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

  6. 洛谷P1219 八皇后

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

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

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

  8. 洛谷P1219 八皇后 我。。。。。。

    代码1    (学弟版) #include<bits/stdc++.h>using namespace std;int l[15];bool s[15];                  ...

  9. 【搜索】P1219 八皇后

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

随机推荐

  1. php面向对象4

    成员属性 基本介绍 成员属性是类的一个组成部分,一般是基本数据类型,也可以是复合类型,资源类型.比如 public $age;就是成员属性 说明 ①成员属性可以是php的任何数据类型(int, flo ...

  2. Spring+MVC+Mybatis整合

    本文是对慕课网上"搞定SSM开发"路径的系列课程的总结,详细的项目文档和课程总结放在github上了.点击查看 什么是秒杀业务 网站售卖某产品时,规定在某个日期开始售卖限量的产品, ...

  3. 历年NOIP选题题解汇总

    联赛前上vijos板刷往年联赛题,使用在线编辑编写代码,祝我rp++. 废话不多说,挑比较有意思的记一下. 题目是按照年份排序的,最早只到了03年. 有些题目因为 我还没写/很早之前写的忘了 所以就没 ...

  4. c#的关键字

    abstract as base bool break byte case catch char checked decimal default delegate continue double do ...

  5. golang sql database drivers

    https://github.com/golang/go/wiki/SQLDrivers SQL database drivers The database/sql and database/sql/ ...

  6. ubuntu 编译运行 opencv C++ 项目

    ubuntu 编译运行 opencv C++ 项目 环境 ubuntu 16.04 opencv3.4.0 一. 编译方法 1)命令行 g++ imageResize.cpp -o resize `p ...

  7. 一起学Linux03之Linux系统目录结构

    我们用XShell登录Linux后,如果你是用root用户登录的,那么直接使用ls命令(List files 列出文件(信息). 注: Linux命令为了方便使用,都是简写.所以,每出现一个新的命令, ...

  8. XML的解析(DOM以及SAX方式)

    感谢http://blog.csdn.net/redarmy_chen/article/details/12951649(关于SAX解析)以及http://blog.csdn.net/zhangerq ...

  9. Nginx: http 跳转 https

    参考:博文 参考:HTTP 状态码解读 Nginx - rewrite 方式 Nginx Server 配置 server { listen ; server_name www.test.com te ...

  10. Laravel 中实现是否关注

    @if ($user->id !== Auth::user()->id) <div id="follow_form"> @if (Auth::user()- ...