首页 > 其他分享 >深度优先搜索 洛谷P1219八皇后

深度优先搜索 洛谷P1219八皇后

时间:2024-05-22 16:20:14浏览次数:24  
标签:优先 洛谷 对角线 dfs depth 搜索 深度 P1219

深度优先搜索

洛谷P1219

这是一道经典的深度优先搜索问题,深度优先搜索可用以下模板:

void dfs(int depth){
	if(达到边界){
		记录解
	}
	for(枚举在depth这一深度,能够使用的解){
		if(解可行){
			记录解(记录已经被使用)
			dfs(depth+1)
			恢复解(恢复原状)
		}
	}
}

题目要求我们找到可行解,这个可行解,使得棋盘上的每一行,每一列,每一条对角线(一个位置有两条对角线)都只有一个棋子。

我们可以将行作为我们的dfs深度,在这一深度下即这一行,枚举每一列,枚举时需要增加判断,首先flag1是判断这一列没有被占领,然后是两条对角线flag2和flag3,不需要判断行的原因是,我们将行作为dfs深度,所以一行只会有一个棋子。

if(!flag1[i] && !flag2[depth+i] && !flag3[depth-i+20])

判断对角线的函数为行数和列数相加,以及行数和列数相减,因为在对角线上,函数为y = x + b或y = -x + b,所以以上面代码判断,加20的原因是可能有负数,比较两数是否相等,加上同一个数(20)不影响判断

根据上方提供模板可写出以下代码

#include<bits/stdc++.h>
using namespace std;
int path[15] = {0}, flag1[100], flag2[100], flag3[100], n, ans = 0;
void dfs(int depth) {
    if(depth > n) {
        ans++;
        if(ans <= 3) {
            for(int i = 1; i <= n; i++) cout << path[i] << ' ';
            cout << endl;
        }
        return;
    }
    for(int i = 1; i <= n; i++) {
        if(!flag1[i] && !flag2[depth+i] && !flag3[depth-i+20]) {
            path[depth] = i;
            flag1[i] = 1; flag2[depth+i] = 1; flag3[depth-i+20] = 1;
            dfs(depth+1);
            flag1[i] = 0; flag2[depth+i] = 0; flag3[depth-i+20] = 0;
        }
    }
}
int main() {
    cin >> n;
    dfs(1);
    cout << ans;
    system("pause");
}

标签:优先,洛谷,对角线,dfs,depth,搜索,深度,P1219
From: https://www.cnblogs.com/rjxq/p/18206511

相关文章

  • 二分答案 洛谷2440木材加工
    二分答案题目详见洛谷P2440木材加工分享一下自己新学习的二分答案的方法,开始可能有点奇怪为啥这样能做,但其实思路很简单。起始思路题目要求我们求最大的分解长度,所以我(们)最开始想的肯定是从大到小(求最大值)枚举答案,看看是否满足,满足不了就加1。但这样暴力肯定是会超时的,那我们......
  • 洛谷 P4383 [八省联考 2018] 林克卡特树
    原题等价于在树上选出\(k+1\)条不相交链,最大化边权和。树形DP。设\(f_{u,k,0/1/2}\)表示在\(u\)的子树中选了\(k\)条链,\(u\)的度数为\(0,1,2\)的最大边权和。注意到状态里缺了链退化为单个点的情况,可以把它放到\(f_{u,k,2}\)中(相当于自环)。转移时分讨一......
  • 小米面试:如何实现优先级线程池?
    我们知道,线程池中的所有线程都是由统一的线程工厂来创建的,当我们指定线程工厂时,线程池中的所有线程会使用我们指定的线程工厂来创建线程;但如果没有指定线程工厂,则会使用默认的线程工厂DefaultThreadFactory来创建线程,核心源码如下:DefaultThreadFactory(){@SuppressWarnin......
  • 洛谷 P10512 序列合并
    哭死,比赛的时候完全想歪了,想的是考虑一次合并能造成多大的贡献,按照贡献排序然后合并。这样做只能考虑局部造成的贡献,然而最后算的时候要考虑整体,所以并不是很对。正着想没有思路就可以倒着想,考虑枚举答案。合并k次,意味着最后是n-k个数。经典从二进制高位到低位考虑,考虑这一位(假......
  • C++中 符号的优先级
    符号运算顺序::从左至右a++a--type()type{}a()a[].->从左至右!~++a--a+a-a(type)sizeof&a*anewnew[]deletedelete[]从右至左.*->*从左至右a*ba/ba%b从左至右a+ba-b从左至右<<>>从左至右<<=>>=从左至右==!......
  • Solution -「洛谷 P8477」 「GLR-R3」春分 下界证明?!
      前情提要:在「洛谷P8477」「GLR-R3」春分中,我们给出了\(\frac{7}{6}n\pm\mathcalO(1)\)的解法,但没能给出相关的下界证明。现在我们尝试给出一个未完全完成的下界证明。  为方便描述,我们综合链接中题意和某个“通俗”的题意,称隔板为“板”,称溶液为“人”。  这个......
  • 「杂题乱刷」洛谷 P10467
    题目链接P10467[CCC2007]SnowflakeSnowSnowflakes解题思路字符串哈希板子题。思路就是我们给每个数列的所有排列都哈希一个值,然后判断是否有不同的数列的哈希值相同,如果有,就输出Twinsnowflakesfound.,否则就输出Notwosnowflakesarealike.。参考代码这里使用双哈......
  • 「杂题乱刷」洛谷 P10468 兔子与兔子
    题目链接P10468兔子与兔子解题思路字符串哈希板子题。思路就是我们给字符串的每一个前缀和后缀都用一种特定的方式使其变为一个值,比如取一个乘数和模数,可以证明这样出错的概率极低。参考代码这里使用自然溢出三哈希。#include<bits/stdc++.h>usingnamespacestd;#defin......
  • 【CodeChef】3out1in(优先队列)
    题目大意:给出数组a,问对于所有满足\(1\lek\len\)的奇数\(k\),\(f([a_1,a_2,...,a_k])\)的值。\(f([a_1,a_2,...,a_n])\)的值为对数组\([a_1,a_2,...,a_n]\)进行\(\frac{n+1}{2}\)次操作(选择数组中的三个元素,将其中一个取相反数,然后让它们合并成一个元素)后,数组最后剩下元素的最大......
  • 洛谷题单指南-动态规划3-P1220 关路灯
    原题链接:https://www.luogu.com.cn/problem/P1220题意解读:按坐标顺序排列1~n个路灯,每个路灯有不同的功耗,老张从位置c开始关灯,第一时间关掉c位置的灯,每次关掉一个灯之后,可以往右走、也可以往左走关下一个灯,老张速度是1m/s,求所有灯都关掉所消耗的最少功耗。解题思路:由题意分析,关......