首页 > N皇后问题
头像 在刷题的单身狗很开心
发表于 2023-09-20 08:54:46
深度优先遍历加剪枝的经典问题。在递归过程中按行去递归保证了不在同一行,然后使用结构体数组来保存前面行已选定的坐标,在每一行都循环的去选择是哪一列。然后判断和之前的是否在同一列或同一对角线。如果递归到N次了,那么就证明可以有一个方案了。 如何判断在同一对角线:abs(y-y`)==abs(x-x 展开全文
头像 HFreedom
发表于 2022-07-29 15:46:36
题目描述 给出一个n*n的国际象棋棋盘,你需要在棋盘中摆放n个皇后,使得任意两个皇后之间不能互相攻击。具体来说,不能存在两个皇后位于同一行、同一列,或者同一对角线。请问共有多少种摆放方式满足条件。 输入描述 一行,一个整数n(1≤n≤12),表示棋盘的大小。 输出描述 输出一行一个整数,表示总共有多 展开全文
头像 2022115828
发表于 2023-06-24 20:25:58
思路:按照行来dfs,同时使用col,dg,udg三个数组来记录列,对角线和反对角线是否有棋子。 当我们的u,也就是棋子数等于n的时候,就是我们把棋子安放完成,返回即可。 这里我们的u也同时是行数,这里i则可以理解为列数,从0到n-1列,也就是n列。 我们可以发现一个规律,一条对角线上面的x,y坐标 展开全文
头像 等我沉淀一下
发表于 2023-03-15 20:09:58
家人们看图吧 选错编辑器了 include<bits/stdc++.h> using namespace std; int n; int lie[15];//判断列 int zuo[30];//开的至少得是2n+1个(至少有2n+1个斜线 具体看下文),可多开几个不必精确计算 int y 展开全文
头像 默默然诶
发表于 2022-07-11 19:51:41
#include<iostream> using namespace std; int n; int a[14]; int lie[14], zd[30], fd[30]; int ans = 0; void dfs(int dep) { if (dep > n) { a 展开全文
头像 asdasdasdasdas
发表于 2024-03-30 14:03:57
dfs问题 1、把棋盘看作一个g[n][n]数组,我们一行一行的放,例如我们第一个肯定放g[1][1]这里,然后看下一行,下一行放哪呢?这就需要判断,从题目得知要满足三个条件(因为一行一行放所以行不重复这一条不用考虑,减去): 1.1:同一列不能有重复 --------- 1.2:同一对角 展开全文
头像 牛牛冲_冲_冲_
发表于 2022-07-16 07:23:33
欢迎互关,题解本蒟蒻持续发布 #include<bits/stdc++.h> using namespace std; const int N=20; int cnt=0,n **b代表竖直方向的某一列是否被标记,lf和rg是left和right的简写,分别表示左斜方向和右 斜方向是否 展开全文
头像 Rain_Fly
发表于 2024-03-13 22:19:14
题目描述 给出一个n×nn\times nn×n的国际象棋棋盘,你需要在棋盘中摆放nnn个皇后,使得任意两个皇后之间不能互相攻击。具体来说,不能存在两个皇后位于同一行、同一列,或者同一对角线。请问共有多少种摆放方式满足条件。 输入描述: 一行,一个整数n,表示棋盘的大 展开全文
头像 2004
发表于 2025-04-18 00:32:01
利用dfs+回溯:因为没行只能放一个所以可以不用对行(dep)进行标记,j遍历列副对角线:dep+j;主对角线:dep+n-j。 #include<iostream> #include<vector> using namespace std; const int N=12; 展开全文
头像 yhyh_2
发表于 2024-09-20 00:53:31
#include<iostream> #include<cstring> #include<algorithm> #include<cmath> using namespace std; const int N = 20; struct node 展开全文