首页 > 其他分享 >【dfs基础题】洛谷P1219题解

【dfs基础题】洛谷P1219题解

时间:2023-09-14 11:57:21浏览次数:50  
标签:洛谷 同一 int 题解 sum 互相攻击 对角线 皇后 P1219

题目大意

给定棋盘的规格为 \(n×n\),现在要摆 \(n\) 个皇后,使得每个皇后不能互相攻击。

题目解答

由题意可知,如果两个皇后在同一行或同一列或同一对角线,那么就会互相攻击。

那么就简单了,若当前要摆的是第 \(i\) 个皇后,那么只需要 for 循环一遍前面的 \(i-1\) 个皇后,判断前面的皇后会不会和第 \(i\) 个皇后互相攻击。

我们已经知道行数都都是固定的,我们只要判断两个皇后是否在同一列或同一对角线即可。

记当前第 \(i\) 个皇后在第 \(h\) 行第 \(l\) 列、前面的 \(i-1\) 个皇后的列数都放在了 \(a\) 数组,接下来来看怎么判断:

  • 列:这个比较简单,只要前面的 \(i-1\) 个皇后都不满足
for(int j=1;j<=i-1;j++){
	if(a[j]==l)
}

那么就代表这两个皇后不在同一列;

  • 对角线:对角线我们可以画一个棋盘,然后标记一下对角线所在的行和列,就会发现规律,如果前面的 \(i-1\) 个皇后都不满足
for(int j=1;j<=i-1;j++){
	if(abs(h-j)==abs(l-a[j]))
}

那么就代表两个皇后不在同意对角线。

代码

#include<bits/stdc++.h>
using namespace std;
int n,sum,a[110];
int awa(int h,int l){
	int i;
	for(i=1;i<=h-1;i++)
		if((l==a[i])||(abs(h-i)==abs(l-a[i])))return 0;//判断是否在同一列或同意对角线 
	return 1;
}
void queen(int qwq){
	int i;
	if(qwq>n){
		sum++;
		if(sum<=3){//前三组输出 
			for(i=1;i<=n;i++)cout<<a[i]<<" ";
			cout<<endl;
		}else return;
	}
	for(i=1;i<=n;i++){
		if(awa(qwq,i)==1){//当前皇后和前面的皇后不会互相攻击 
			a[qwq]=i;/*摆下当前皇后*/queen(qwq+1);/*继续来到下一列放置皇后*/a[qwq]=0;/*回溯*/
		}
	}
}
int main(){
	cin>>n;	
	queen(1);
	cout<<sum<<endl;
	return 0;
}

标签:洛谷,同一,int,题解,sum,互相攻击,对角线,皇后,P1219
From: https://www.cnblogs.com/FSqwq/p/17702147.html

相关文章

  • AtCoder Beginner Contest 319 全部题解
    AtCoderBeginnerContest319全部题解ALegendaryPlayers该题只需使用判断来写出所有的答案,注意不要复制错。#include<bits/stdc++.h>usingnamespacestd;strings;intmain(){ cin>>s; if(s=="tourist")cout<<3858<<endl; if(s=="ksun4......
  • 洛谷[P1305 新二叉树] Tag:二叉树、基础数据结构
    P1305新二叉树题目描述:输入一串二叉树,输出其前序遍历。输入格式:第一行为二叉树的节点数$n(1\len\le26)$,后面\(n\)行,每一个字母为节点,后两个字母分别为其左右儿子。特别地,数据保证第一行读入的节点必为根节点。空节点用*表示输出格式:二叉树的前序遍历。思路:对......
  • 云主机测试Flink磁盘满问题解决
    问题描述:使用云主机测试Flink时,根目录满了。经排查发现运行Flink任务后根目录空间一直在减少,最后定位持续增加的目录是/tmp目录解决方法:修改Flink配置使用一个相对较大的磁盘目录做为Flink运行时目录#Overridethedirectoriesfortemporaryfiles.Ifnotspecified,the#sy......
  • Codeforces 1868C/1869E Travel Plan 题解 | 巧妙思路与 dp
    题目链接:TravelPlan题目大意:\(n\)个点的完全二叉树,每个点可以分配\(1\simm\)的点权,定义路径价值为路径中最大的点权,求所有路径的价值和。对于任意长度(这里主要指包括几个节点)的路径\(t\),最大点权不超过\(k\)的方案数有\(k^t\)个,因此最大点权恰好为\(k\)的方案数有......
  • 网络规划设计师真题解析--独立磁盘冗余阵列RAID(一)
    RAID1中数据冗余是通过什么技术实现的()。A.OXR运算    B.海明码校验    C.P+Q双校验    D.镜像答案:D解析:RAID1,磁盘镜像,可并行读数据,由于在不同的两块磁盘写入相同数据,写入数据比RAID0慢一些。安全性最好,但空间利用率最低。实现RAID1至少需要2块硬盘。《网络规划设......
  • CF1043D Mysterious Crime 题解
    CF1043DMysteriousCrime题解题意给定\(m\)个长为\(n\)的序列,问它们的公共子串的个数。\(n\le10^5,m\le10\)。已经死掉的做法一眼广义后缀自动机。建出后缀自动机,然后在parenttree上面跑dfs。正确性会在下面证明。但是因为广义SAM巨大的常数,蒟蒻的代码跑了1......
  • 2023短学期0913题解
    将字符串作为输入流来处理(提取单词)【C系列4.7】函数训练之暗号Descriptioncyn小朋友今天参加了小学举办的侦探活动,她的任务是从暗号纸条的内容上找出特工Q给出的所有的暗号(即Q开头的单词)Input输入一串含有空格的字符串,字符串的长度不超过300。Output按顺序每行......
  • 【题解】[POI2015] MOD
    传送门挺恶心的感觉这题代码,就来写写题解。题目分析假设我们现在要删掉\((x,y)\)这条边,思考这样能贡献的最大或最小直径。不难发现,此时一棵树分裂成了两棵树\(a,b\),我们令它们的直径分别为\(la,lb\)。将两棵树内直径的任意端点连起来,发现\(maxi=la+lb+1\)。将两棵树内直......
  • 洛谷 CF707C Pythagorean Triples の 题解
    这道题是一道数论题,不可用暴力通过,因为输入范围极大,基本上循环是不能在这道题上使用的了。前面大佬们讲的我听不懂,于是在教练的帮助下,我利用题面给出的多组样例找到了规律。在此之前,我们先设输入的数为\(n\)。\(n\)分三种情况。\(n\)是奇数;\(n\)是偶数;\(n\)小于等于......
  • 洛谷 P9503『MGOI』Simple Round I | B. 魔法照相馆 の 题解
    这道题是一道模拟题,坑点不多,但是细节特多,所以导致大部分人\(A\)不了这道题。这道题我也写了注释,如果思路没明白可以看代码和注释的。先创建一个长度为\(3\)的字符串\(s1\),这个字符串的意思就是模拟现在的这几个幕布的情况,这里分了四个字符代表着四种情况,详细如下该字符串......