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

上面的布局可以用序列2 4 6 1 3 5来描述,第i个数字表示在第i行的相应位置有一个棋子,如下:
行号 1 2 3 4 5 6
列号 2 4 6 1 3 5
这只是跳棋放置的一个解。请编一个程序找出所有跳棋放置的解。并把它们以上面的序列方法输出。解按字典顺序排列。请输出前3个解。最后一行是解的总个数。
输入输出格式
输入格式:
一个数字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 弱鸡艰难的写了一个dfs 交一遍之后最后一个测试点没过 应该就是n==13的时候 本地跑了一下确实将近两秒才出来
我的判断条件:
if(m[s][i]==)
{
int flag=;
for(x=;x<n;x++)
if(m[x][i]==)
{
flag=;
break;
}
if(flag)
for(y=i;y<n;y++)
if(m[s+y-i][y]==&&(s+(y-i)<n))
{
flag=;
break;
}
if(flag)
for(y=;y<i;y++)
if(m[s-(i-y)][y]==&&(s-(i-y)>=))
{
flag=;
break;
}
if(flag)
for(y=;y<i;y++)
if(m[s+(i-y)][y]==&&(s+(i-y)<n))
{
flag=;
break;
}
if(flag)
for(y=i;y<n;y++)
if(m[s-(y-i)][y]==&&(s-(y-i)>=))
flag=;
if(flag)
{
m[s][i]=;
f[s]=i+;
dfs(s+);
m[s][i]=;
}
显然写的又笨又蠢。。
瞄一眼题解:
#include<iostream>
#include<cstdlib>
#include<cstdio>
#include<cmath>
using namespace std;
int a[],b[],c[],d[];
int total;
int n;
int print()
{
if(total<=)
{
for(int k=;k<=n;k++)
cout<<a[k]<<" ";
cout<<endl;
}
total++;
}
void queen(int i)
{
if(i>n)
{
print();
return;
}
else
{
for(int j=;j<=n;j++)//尝试可能的位置
{
if((!b[j])&&(!c[i+j])&&(!d[i-j+n]))//如果没有皇后占领,执行以下程序
{
a[i]=j;//标记i排是第j个
b[j]=;//宣布占领纵列
c[i+j]=;
d[i-j+n]=;
//宣布占领两条对角线
queen(i+);//进一步搜索,下一个皇后
b[j]=;
c[i+j]=;
d[i-j+n]=;
//(回到上一步)清除标记
}
}
}
}
int main()
{
cin>>n;
queen();
cout<<total;
return ;
}
其中 a数组表示的是行;b数组表示的是列;c表示的是左下到右上的对角线;d表示的是左上到右下的对角线;
因为对于一个对角线来说 其中的点的i和j是有确定的关系的 所以不必挨个遍历去寻找对角线上有没有其他的皇后 直接把判断的复杂度降低到了O(1)!!
dalao确实是dalao 本弱鸡还是太菜了
洛谷 p1219 八皇后的更多相关文章
- 洛谷 P1219 八皇后【经典DFS,温习搜索】
P1219 八皇后 题目描述 检查一个如下的6 x 6的跳棋棋盘,有六个棋子被放置在棋盘上,使得每行.每列有且只有一个,每条对角线(包括两条主对角线的所有平行线)上至多有一个棋子. 上面的布局可以用序 ...
- 洛谷 P1219八皇后
把全部,在这251秒,赌上! ——<游戏人生zero> 题目:https://www.luogu.org/problem/P1219 八皇后是一道非常非常非常经典的深搜+回溯的题目. 这道 ...
- 【洛谷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:一个皇后会攻击到这个皇后所在的 ...
随机推荐
- 10 python 初学(Python 的编码解码)
Python 2 : ASCII Python 3 :Unicode
- oracle RAC 查询告警日志位置
[grid@db2 db2]$ adrci ADRCI: Release 12.2.0.1.0 - Production on Mon Feb 25 15:51:14 2019 Copyright ( ...
- MyOD 代码实现
MyOD的代码实现 一.题目要求: 编写MyOD.java 用java MyOD XXX实现Linux下od -tx -tc XXX的功能 二.设计思路 OD命令详解: 因此,该题目所要实现的功能为以 ...
- HotSpot虚拟机对象探秘(对象创建,对象内存布局,对象访问定位)
以常用的HotSpot虚拟机和JAVA内存区域堆为例,探讨对象的创建,对象的内存布局以及对象的访问定位 一.对象的创建 1)类加载:虚拟机遇到一条new指令时,先检测这个指令的参数能否在常量池中定位到 ...
- C# - Span 全面介绍:探索 .NET 新增的重要组成部分
假设要公开特殊化排序例程,以就地对内存数据执行操作.可能要公开需要使用数组的方法,并提供对相应 T[] 执行操作的实现.如果方法的调用方有数组,且希望对整个数组进行排序,这样做就非常合适.但如果调用方 ...
- 用Python实现大文件分割
python代码如下: import sys,os kilobytes = 1024 megabytes = kilobytes*1000 chunksize = int(200*megabytes) ...
- Hibernate各种基本注解及一对一(多)关系映射采坑笔记
hibernate提供两种方式配置关系映射,一种XMl配置,一种注解.SpringBoot已经自带了hibernate注解方式,我也是特别喜欢使用注解,特此记下常用的知识点. 1.基本注解 @Tabl ...
- Android开发之自定义万能BaseAdapter
话不多说哦,直接上模板: package com.zyzpp.adapter; import android.content.Context; import android.util.SparseAr ...
- 撒花!中文翻译仓库链接已加入 ML.NET 官方示例网站首页
从2018年12月02日决定开始做ML.NET 示例中文版https://github.com/feiyun0112/machinelearning-samples.zh-cn,然后以每天一篇的速度进 ...
- java连接Mysql8
相较于之前版本会有部分改动 pom依赖 <dependency> <groupId>mysql</groupId> <artifactId>mysql- ...