这个题是一道USACO的经典dfs,与我见面的时间起码七个月了。

放置n个皇后于n*n棋盘,他们不能互相吃(行,列,对角线),问有几种摆法?于是想到了dfs(自我认为有图的就不用DP)。首先确定好了要枚举的是第i行,边界则是搜索到了n+1行,其次循环判断第j列可不可以放,如果可以放就把这个点同一行以及同一列打上标记,然后继续搜索,回溯,将标记抹去。在这里我们要设一个二维flag来打标记,flag[1][j]=1,flag[2][i+j]=1,flag[3][i-j+n]=1

1.dfs枚举什么要想清楚,这种情况下只需要求解行和列即可,所以只枚举行或列就行

2.对角线的表示方法:x+y相同时为左下到右上,x-y相同时为坐上到右下

3.考虑时间复杂度的话直接给点打标记,别用bool flag看能不能继续,这样慢

代码

 #include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
int a[];
int flag[][];
int n;
int cnt=;
void dfs(int i){//枚举到了第i行
if(i>n){//结束了
cnt++;
if(cnt<=){
for(int i=;i<=n;i++){//每次会自动更新
cout<<a[i]<<" ";
}
cout<<endl;
}
return;
}
for(int j=;j<=n;j++){
if(flag[][j]==&&flag[][i+j]==&&flag[][i-j+n]==){
a[i]=j;
flag[][j]=;
flag[][i+j]=;//对角线
flag[][i-j+n]=;
dfs(i+);
flag[][j]=;
flag[][i+j]=;
flag[][i-j+n]=;
}
}
}
int main(){
cin>>n;
dfs();
cout<<cnt;
}

P1219八皇后的更多相关文章

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

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

  2. 洛谷 P1219八皇后

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

  3. P1219 八皇后

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

  4. 洛谷 p1219 八皇后

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

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

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

  6. 【搜索】P1219 八皇后

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

  7. 洛谷P1219 八皇后

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

  8. luogu p1219 八皇后

    https://www.luogu.org/problem/show?pid=1219 经典问题,搜索一遍过. 重点是判断皇后能否在map[x][y]放下的条件 因为是dfs的时候过程中 x 是递增的 ...

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

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

  10. 【洛谷P1219 八皇后】

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

随机推荐

  1. 【leetcode】1220. Count Vowels Permutation

    题目如下: Given an integer n, your task is to count how many strings of length n can be formed under the ...

  2. 【leetcode】1200. Minimum Absolute Difference

    题目如下: Given an array of distinct integers arr, find all pairs of elements with the minimum absolute ...

  3. Error: pgraster_wkb_reader: grayscale band type 10 unsupported

    错误原因:Float32 is not supported for rendering.即栅格数据类型Float32不支持. cmd中用GDAL查看.在波段中的数据类型是Float32的不支持渲染. ...

  4. org.thymeleaf.exceptions.TemplateProcessingException: Could not parse as expression:

    org.thymeleaf.exceptions.TemplateProcessingException: Could not parse as expression:

  5. Java多线程的创建方法

    Java 线程类也是一个 object 类,它的实例都继承自java.lang.Thread 或其子类. 可以用如下方式用 java 中创建一个线程,执行该线程可以调用该线程的 start()方法: ...

  6. C语言 - C语言简介

    一.C语言的发展史 C语言的发展离不开B语言,我们先从B语言说起.在1970年时,贝尔实验室的肯.汤姆逊将BCPL语言进行修改,由于肯.汤姆逊是从BCPL语言进行修改,因此,此时B语言就诞生了,B的含 ...

  7. sh_09_打印多条分隔线

    sh_09_打印多条分隔线 def print_line(char, times): """打印单行分隔线 :param char: 分隔字符 :param times: ...

  8. sqli-labs(30)

    0X01 观摩源码 和29关没区别 只是这里闭合变成了“ 0X02构造语句 爆库名 ?id=&id=-"union select 1,database(),3%23 0X03组合拳打 ...

  9. Singleton(Java)

    1.定义私有静态易变的类变量2.定义getInstance静态方法 2.1.若静态变量为null,则在同步类类型的同时判断静态实例是否为null, 是null则创建新实例赋给静态变量 2.2.不为nu ...

  10. 第四周总结 & 实验报告(二)

    第四周课程总结 一.String类 1.实例化 (1)直接赋值 public class Xxxx{ public static void main(String args[]){ String a ...