首页 > 其他分享 >蓝桥杯-N皇后

蓝桥杯-N皇后

时间:2024-04-10 18:33:56浏览次数:24  
标签:return int DFS 蓝桥 chosen 棋子 放置 皇后

0.题目

【题目描述】

有一个N*N的矩阵棋盘和N个棋子,现在需要将N个棋子按要求放置在矩阵方格中。

要求:

1、任意两颗棋子不能在同一行

2、任意两个棋子不能在同一列

3、任意两个棋子不能在同一对角线上(下面的红线都是对角线)

根据以上要求,问N个棋子放置到N*N矩阵中有多少种放置方案?

【输入描述】

输入一个正整数N(1<N<11),表示N*N的矩阵方格和N个棋子数量。

【输出描述】

输出N个棋子按要求放置到N*N的矩阵中,有多少种放置方案?

1.题解

1.1 DFS搜索

思路

对于不能同行,整体按行顺序从上到下进行遍历(外层循环)
难点主要是纠正同列和对角线的情况,利用记忆化存储存储之前节点实际皇后摆放位置,然后和当前皇后位置进行比较
如果发生冲突,放弃该位置; 如果不发生冲突, 可以选择该位置,也可以不选择该位置,同时更新当前chosen数组的值即可

代码

#include<bits/stdc++.h>
using namespace std;

// 表示第n行的皇后摆放的列位置
int chosen[11] = {-1};
int ans = 0;
int n;

// x表示当前已经选择了x个
void DFS(int x) {
	if (x == n + 1) {
		ans++;
		return;
	}

//	// 选择该行放置的列位置i, [x][i],
//	for (int i = 1; i <= n; i++) {
//		if(x == 1) {
//			chosen[x] = i;
//			DFS(x + 1);
//		} else {
//			// 遍历之前的行, [j][chosen[j]]
//			for (int j = 1; j < x; j++) {
//				if ((chosen[j] != i) && (abs(chosen[j] - i) != abs(x - j))) {
//					// 选择该位置
//					chosen[x] = i;
//					DFS(x + 1);
//					// 不选择该位置
//					chosen[x] = -1;
//				}
//			}
//		}
//	}

	// 选择该行放置的列位置i, [x][i],
	for (int i = 1; i <= n; i++) {
		bool conflict = false;
		// 遍历之前的行,判断有无冲突 [j][chosen[j]]
		for (int j = 1; j < x; j++) {
			if((chosen[j] == i) || (abs(j - x) == abs(chosen[j] - i))){
				conflict = true;
				break;
			} 
		}
		// 没有冲突 
		if(!conflict){
			// 选择该数
			chosen[x] = i;
			DFS(x+1);
			// 不选择该数 
			chosen[x] = -1;
		}

	}
}

int main() {
	cin >> n;
	DFS(1);
	cout << ans;
	return 0;
}

优化版本

主要是封装了函数,使其更符合普遍模板

#include <bits/stdc++.h>
using namespace std;

int chosen[11] = {0};
int ans = 0;
int n;

// 判断是否会发生冲突(剪枝) 
int PD(int k){
	for(int i = 1; i < k; i++){
		if(abs(k-i) == abs(chosen[k]-chosen[i])){
			return 0;
		} else if(chosen[k] == chosen[i])
			return 0;
	}
	return 1;
} 

// 判断返回条件 
bool check(int a){
	if(a > n){
		ans++;
	}
	else return 0;
	return 1;
} 

void DFS(int x) {
    if (check(x)) {
		return;
    }
    
    // 尝试在第 x 行的每一列放置皇后 [x][i];
    for (int i = 1; i <= n; i++) {
		chosen[x] = i; 
		// 判断这一步是否冲突
		if(PD(x)) {
			DFS(x+1);
		}else{
			// 不需要清零,每次开头的chosen[x] = i;就可以实现刷新 
//			chosen[x] = 0;
			continue;
		}
    }
}

int main() {
    cin >> n;
    DFS(1);
    cout << ans << endl;
    return 0;
}

标签:return,int,DFS,蓝桥,chosen,棋子,放置,皇后
From: https://www.cnblogs.com/trmbh12/p/18127144

相关文章

  • P8661 [蓝桥杯 2018 省 B] 日志统计 题解
    好久没写题解了,水一篇。这里主要想讲的是不同的处理方法,在阅读本篇题解前请确保读完题。详解一,排序这很好理解,题目要求将热帖从小到大输出,同时题目中还有相对的时间这一概念,因此将输入的\(id\)与\(ts\)按照优先\(id\)其次\(ts\)的排序方式从小到大,排序,这样输出时就没......
  • 力扣51 N皇后 Java版本
    文章目录题目描述代码题目描述按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。n皇后问题研究的是如何将n个皇后放置在n×n的棋盘上,并且使皇后彼此之间不能相互攻击。给你一个整数n,返回所有不同的n皇后问题的解决方案。每......
  • 蓝桥杯真题代码记录(最优清零方案
    目录1.题目:2.我的代码:小结:1.题目:给定一个长度为N的数列41,42,…,AN。现在小蓝想通过若干次操作将这个数列中每个数字清零。每次操作小蓝可以选择以下两种之一:1.选择一个大于0的整数,将它减去1;2.选择连续区个大于0的整数,将它们各减去1。小蓝最少经......
  • 第十一届蓝桥杯C/C++组C组决赛之思维风暴 快速解题
    十五届蓝桥杯即将开赛,十一届的蓝桥杯国赛的一些巧妙解法。美丽的2 题目描述本题为填空题,只需要算出结果后,在代码中使用输出语包将所填结果输出即可。小蓝特别喜欢2,今年是公元2020年,他特别高兴。他很好奇,在公元1年到公元2020年(包含)中,有多少个年份的数位中包含数字2?......
  • Acwing2024蓝桥杯DFS
    模板:AcWing826.单链表利用数组创建单链表:#include<iostream>usingnamespacestd;constintN=100005;inthead,value[N],nextt[N],id;voidInit(){head=-1,id=0;}voidHead_Insert_x(intx){value[id]=x;nextt[id]=head;head=id++;}voidD......
  • 杨辉三角形(蓝桥杯,acwing)
    题目描述:下面的图形是著名的杨辉三角形:如果我们按从上到下、从左到右的顺序把所有数排成一列,可以得到如下数列:1,1,1,1,2,1,1,3,3,1,1,4,6,4,1,...给定一个正整数 N,请你输出数列中第一次出现 N 是在第几个数?输入格式:输入一个整数 N。输出格式:输......
  • 蓝桥杯-公平抽签
    0.题目题目描述小A的学校,蓝桥杯的参赛名额非常有限,只有m个名额,但是共有n个人报名。作为老师非常苦恼,他不知道该让谁去,他在寻求一个绝对公平的方式。于是他准备让大家抽签决定,即m个签是去,剩下的是不去。小A非常想弄明白最后的抽签结果会有多少种不同到情况,请你设计一......
  • 蓝桥杯 强者挑战赛9
    标算无理数位数查询LL没开全,WA想不太清楚细节,写了半个多小时。。。预处理而不是现算会好写一点赛时做法先确定第\(n\)位所属的数的位数,再确定该位数中第\(k\)大的数标算设\(g(x)\)表示\(m\)进制下\(1\simx\)的位数和,二分第\(n\)位所属的数贝贝的集合先不......
  • 蓝桥杯之初等数论
    在蓝桥杯竞赛中,初等数论部分涉及多个关键知识点。以下是对这些知识点的详细列出、基本概念解释、应用实例以及解题策略和步骤的说明:1.质数与合数基本概念:质数(素数):大于1的自然数中,只能被1和它本身整除的数。合数:除了1和它本身以外还有其他因数的自然数。应用实例:题目:......
  • 蓝桥杯-外卖店优先级
     代码及其解析#include<bits/stdc++.h>usingnamespacestd;constintN=100010;intorder[N];//order[id]第id号店上一次的订单,记录的是时间intprior[N];//prior[id]第id号店的优先级intflag[N];//flag[id]第id号店在不在优先缓存中structnode{......