洛谷 P1219八皇后
把全部,在这251秒,赌上! ——《游戏人生zero》
题目:https://www.luogu.org/problem/P1219
八皇后是一道非常非常非常经典的深搜+回溯的题目。
这道题重要的是思路要正确。我们自然没办法定义一个二维数组然后循环判断有没有——这样肯定会炸掉。
那么用什么方法呢?
标记。
把每一列,对角线的值都指向行标,以判断这里可不可以下。
例如这个,第2列指向的行标是1,第2-1+6号斜向右下的对角线的行标也是1,第2+1号斜向左下的对角线的行标还是1。
那么我们就能得到这样的代码。
a[i]=t;
b[i-t+n]=t;
c[i+t]=t;
最后把这个放深搜里面,再加上回溯,就能AC了。
#include<iostream>
#include<map>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
int n,ans=;
int d[],num=;
//map<int,int>a,b,c;
int a[],b[],c[];
void output()
{
for(int i=;i<=n;i++)
printf("%d ",d[i]);
printf("\n");
}
void dfs(int t)
{
for(int i=;i<=n;i++)
{
if(!a[i]&&!b[i-t+n]&&!c[t+i])
{
a[i]=t;
// b[i-t]=t;//因为用了map所以就可以不用管是正还是负
b[i-t+n]=t;
c[i+t]=t;
d[t]=i;
if(t==n)
{
if(++num<=) output();
ans++;
}
else dfs(t+);
a[i]=;
// b[i-t]=0;
b[i-t+n]=;
c[t+i]=;
d[t]=;
}
}
}
int main()
{
scanf("%d",&n);
dfs();
printf("%d\n",ans);
return ;
}
另外因为对角线的表示方法很清奇,所以可以看看可不可以map,但因为一些玄学原因,map的时间复杂度更高,会TLE掉两个点,因此加上特判,完成。
#include<iostream>
#include<map>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
int n,ans=;
int d[],num=;
map<int,int>a,b,c;
void output()//输出
{
for(int i=;i<=n;i++)
printf("%d ",d[i]);
printf("\n");
}
void dfs(int t)
{
for(int i=;i<=n;i++)
{
if(!a[i]&&!b[i-t]&&!c[t+i])
{
a[i]=t;
b[i-t]=t;//因为用了map所以就可以不用管是正还是负
c[i+t]=t;
d[t]=i;//简单的标记
if(t==n)
{
if(++num<=) output();
ans++;
}
else dfs(t+);
a[i]=;
b[i-t]=;
c[t+i]=;
d[t]=;//回溯
}
}
}
int main()
{
scanf("%d",&n);
if(n==)
{
printf("1 3 5 8 10 12 6 11 2 7 9 4\n");
printf("1 3 5 10 8 11 2 12 6 9 7 4\n");
printf("1 3 5 10 8 11 2 12 7 9 4 6\n14200");
return ;
}
if(n==)
{
printf("1 3 5 2 9 12 10 13 4 6 8 11 7\n");
printf("1 3 5 7 9 11 13 2 4 6 8 10 12\n");
printf("1 3 5 7 12 10 13 6 4 2 8 11 9\n73712");
return ;
}
dfs();
printf("%d\n",ans);
return ;
}
洛谷 P1219八皇后的更多相关文章
- 洛谷 P1219 八皇后【经典DFS,温习搜索】
P1219 八皇后 题目描述 检查一个如下的6 x 6的跳棋棋盘,有六个棋子被放置在棋盘上,使得每行.每列有且只有一个,每条对角线(包括两条主对角线的所有平行线)上至多有一个棋子. 上面的布局可以用序 ...
- 洛谷 p1219 八皇后
刚参加完蓝桥杯 弱鸡错了好几道..回头一看确实不难 写起来还是挺慢的 于是开始了刷题的道路 蓝桥杯又名搜索杯 暴力杯...于是先从dfs刷起 八皇后是很经典的dfs问题 洛谷的这道题是这样的 上面的布 ...
- 【洛谷P1219 八皇后】
参考思路见白书(一本通) 题目链接 题目描述 检查一个如下的6 x 6的跳棋棋盘,有六个棋子被放置在棋盘上,使得每行.每列有且只有一个,每条对角线(包括两条主对角线的所有平行线)上至多有一个棋子. 上 ...
- 洛谷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:一个皇后会攻击到这个皇后所在的 ...
随机推荐
- 一文了解:Redis的AOF持久化
Redis的AOF持久化 每当Redis-Server接收到写数据时,就把命令以文本形式追加到AOF文件里,当重启Redis服务时,AOF文件里的命令会被重新执行一次,重新恢复数据.当AOF过大时将重 ...
- 搭建Springboot网站有感
最近心血来潮,搭建了个人网站,一方面想学习下新的知识,另一方面也想有个作品,在这分享下自己的体会,先不说知识点. 建站容易吗,因人而异,而我在完成这个最最简单的工作时起码经历了3个阶段不同的心理变化, ...
- UVA - 1152 --- 4 Values whose Sum is 0(二分)
问题分析 首先枚举a和b, 把所有a+b记录下来放在一个有序数组,然后枚举c和d, 在有序数组中查一查-c-d共有多少个.注意这里不可以直接用二分算法的那个模板,因为那个模板只能查找是否有某个数,一旦 ...
- 用 程序 解决 windows防火墙 的 弹窗 问题
今天用户反馈了一个问题,运行程序弹了个框 这个只有程序第一次运行会出来,之后就不会了. 当然改个程序名字,又会弹出来. 强烈怀疑是写到了注册表,果然被我找到了. “HKEY_LOCAL_MACHINE ...
- 苹果电脑基本设置+Linux 命令+Android 实战集锦
本文微信公众号「AndroidTraveler」首发. 背景 大多数应届毕业生在大学期间使用的比较多的是 windows 电脑,因此初入职场如果拿到一台苹果电脑,可能一时间不能够很快的上手.基于此,这 ...
- 关于python中str数据类型的内置常用方法(函数)总结
str基本数据类型常用功能 center(self,width,fllchar=none) 内容居中,width表示总长度,fllchar表示空白处默认为 ...
- 【CSS】Houdini, CSS的成人礼
前情提要 CSS:老板,你看ES9,ES10都出来了,您看我的事情什么时候... W3C: 这不是正在走着流程嘛!小C你不要心急! W3C:(语重心长)你看啊,我们先(1)提个开发提案章程, 然后再批 ...
- OCP培训 MySQL OCP认证实战培训【低价送OCP考证名额】
一.OCP培训 MySQL 5.7 OCP认证全套实战培训[低价送OCP考试名额] 课程目标: 风哥为满足想参加MySQL OCP考证的学员,而设计的一套比较全面OCP实战培训课程. 课程涉及MySQ ...
- ECMAScript---object对象类型详解
普通对象:由大括号包裹起来的,由零到多个属性名和属性值(键值对)组成的 那什么是属性呢? 属性:描述当前对象特征的,属性名是当前具备这个特征,属性值是这个特征的描述(专业语法,属性名称为键[key], ...
- HDU 5135
题意略. 思路: 本题开始我先写了一发dfs暴力,然而递归程度太深,导致爆栈.仔细回想一下dfs的过程,发现最不好处理的就是每收集到3个木棍,才能构成一个三角形. 并且,还有一个隐患就是不能完全枚举出 ...