蓝桥杯 基础练习 2n皇后问题 (简单dfs暴力+优化剪枝)

2024-02-03 23:58

本文主要是介绍蓝桥杯 基础练习 2n皇后问题 (简单dfs暴力+优化剪枝),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

基础练习 2n皇后问题  
时间限制:1.0s   内存限制:512.0MB
       
问题描述
给定一个n*n的棋盘,棋盘中有一些位置不能放皇后。现在要向棋盘中放入n个黑皇后和n个白皇后,使任意的两个黑皇后都不在同一行、同一列或同一条对角线上,任意的两个白皇后都不在同一行、同一列或同一条对角线上。问总共有多少种放法?n小于等于8。
输入格式
输入的第一行为一个整数n,表示棋盘的大小。
  接下来n行,每行n个0或1的整数,如果一个整数为1,表示对应的位置可以放皇后,如果一个整数为0,表示对应的位置不可以放皇后。
输出格式
输出一个整数,表示总共有多少种放法。
样例输入
4
1 1 1 1
1 1 1 1
1 1 1 1
1 1 1 1
样例输出
2
样例输入
4
1 0 1 1
1 1 1 1
1 1 1 1
1 1 1 1
样例输出
0


/*
思路:枚举  然后检测,回朔 
总共有s=n*n个点   对于每个点 横坐标为s/now,纵坐标为s%n  
水平方向  只需要检查0到s/now
竖直方向  只需要检查0到s%now
斜线方向 只需要检查左上和右上 
能到达s就为一种方案 累加 
*/
#include <iostream>
#include <string.h>
#include <cstdio>
using namespace std;
const int N=10;
int map[N][N]; //0不能放 1可以放 2是黑皇后 3是白皇后 
bool row[N][2],column[N][2];  
//标记横列有没放 优化速度  0代表黑,1代表白 二维数组 
int n,re;
inline bool check(int x,int y,int v){//检查横竖和斜线 int i,a,b;//检查横 /*for(i=0;i<y;i++){if(map[x][i]==v)return false;} *///优化 if(row[x][v-2])return false;//检查竖 /*for(i=0;i<x;i++){if(map[i][y]==v)return false;} *///优化if(column[y][v-2])return false; //检查左上和右上  左上(-1,-1)*i  右上(-1,1)*i //检查左上 for(i=1;;i++){a=x-i;b=y-i;if(a<0||b<0)break;if(map[a][b]==v)return false;}//检查右上 for(i=1;;i++){a=x-i;b=y+i;if(a<0||b>=n)break;if(map[a][b]==v)return false;}return true;
}void dfs(int now){int x=now/n;int y=now%n;//优化 到目前行位置前面每行行都有各一个黑白皇后for(int i=0;i<x;i++)if(!row[i][0]||!row[i][1])return; if(now==n*n){//结果检测  各有n个黑和白皇后/*没优化 n^2 int i,j,black=0,white=0;for(i=0;i<n;i++)for(j=0;j<n;j++){if(map[i][j]==2)black++;else if(map[i][j]==3)white++;}		if(white==n&&black==n) */re++;return;}if(map[x][y]==1){     //当前格子可以放皇后 if(check(x,y,2))  {row[x][0]=1;      //标记行列有人了 column[y][0]=1;map[x][y]=2;dfs(now+1);map[x][y]=1;row[x][0]=0;column[y][0]=0;}if(check(x,y,3)){row[x][1]=1;      //标记行列有人了 column[y][1]=1;map[x][y]=3;dfs(now+1);map[x][y]=1;row[x][1]=0;      column[y][1]=0;}	}dfs(now+1);      //不放 
}int main(){int i,j;while(cin>>n){re=0;memset(row,0,sizeof(row));memset(column,0,sizeof(column));for(i=0;i<n;i++) for(j=0;j<n;j++)cin>>map[i][j];dfs(0);cout<<re<<endl;}return 0;
}
/*
2n皇后问题	01-01 17:01	2.390KB	C++	正确	100	280ms	2.5MB	评测详情
2n皇后问题	01-01 16:56	2.358KB	C++	运行超时	62	运行超时	2.503MB	评测详情
2n皇后问题	01-01 16:41	1.699KB	C++	运行超时	50	运行超时	2.503MB	评测详情
*/


这篇关于蓝桥杯 基础练习 2n皇后问题 (简单dfs暴力+优化剪枝)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/675815

相关文章

Vue3 的 shallowRef 和 shallowReactive:优化性能

大家对 Vue3 的 ref 和 reactive 都很熟悉,那么对 shallowRef 和 shallowReactive 是否了解呢? 在编程和数据结构中,“shallow”(浅层)通常指对数据结构的最外层进行操作,而不递归地处理其内部或嵌套的数据。这种处理方式关注的是数据结构的第一层属性或元素,而忽略更深层次的嵌套内容。 1. 浅层与深层的对比 1.1 浅层(Shallow) 定义

HDFS—存储优化(纠删码)

纠删码原理 HDFS 默认情况下,一个文件有3个副本,这样提高了数据的可靠性,但也带来了2倍的冗余开销。 Hadoop3.x 引入了纠删码,采用计算的方式,可以节省约50%左右的存储空间。 此种方式节约了空间,但是会增加 cpu 的计算。 纠删码策略是给具体一个路径设置。所有往此路径下存储的文件,都会执行此策略。 默认只开启对 RS-6-3-1024k

好题——hdu2522(小数问题:求1/n的第一个循环节)

好喜欢这题,第一次做小数问题,一开始真心没思路,然后参考了网上的一些资料。 知识点***********************************无限不循环小数即无理数,不能写作两整数之比*****************************(一开始没想到,小学没学好) 此题1/n肯定是一个有限循环小数,了解这些后就能做此题了。 按照除法的机制,用一个函数表示出来就可以了,代码如下

hdu1043(八数码问题,广搜 + hash(实现状态压缩) )

利用康拓展开将一个排列映射成一个自然数,然后就变成了普通的广搜题。 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#include<stdlib.h>#include<ctype.h>#inclu

使用opencv优化图片(画面变清晰)

文章目录 需求影响照片清晰度的因素 实现降噪测试代码 锐化空间锐化Unsharp Masking频率域锐化对比测试 对比度增强常用算法对比测试 需求 对图像进行优化,使其看起来更清晰,同时保持尺寸不变,通常涉及到图像处理技术如锐化、降噪、对比度增强等 影响照片清晰度的因素 影响照片清晰度的因素有很多,主要可以从以下几个方面来分析 1. 拍摄设备 相机传感器:相机传

csu 1446 Problem J Modified LCS (扩展欧几里得算法的简单应用)

这是一道扩展欧几里得算法的简单应用题,这题是在湖南多校训练赛中队友ac的一道题,在比赛之后请教了队友,然后自己把它a掉 这也是自己独自做扩展欧几里得算法的题目 题意:把题意转变下就变成了:求d1*x - d2*y = f2 - f1的解,很明显用exgcd来解 下面介绍一下exgcd的一些知识点:求ax + by = c的解 一、首先求ax + by = gcd(a,b)的解 这个

hdu2289(简单二分)

虽说是简单二分,但是我还是wa死了  题意:已知圆台的体积,求高度 首先要知道圆台体积怎么求:设上下底的半径分别为r1,r2,高为h,V = PI*(r1*r1+r1*r2+r2*r2)*h/3 然后以h进行二分 代码如下: #include<iostream>#include<algorithm>#include<cstring>#include<stack>#includ

usaco 1.3 Prime Cryptarithm(简单哈希表暴搜剪枝)

思路: 1. 用一个 hash[ ] 数组存放输入的数字,令 hash[ tmp ]=1 。 2. 一个自定义函数 check( ) ,检查各位是否为输入的数字。 3. 暴搜。第一行数从 100到999,第二行数从 10到99。 4. 剪枝。 代码: /*ID: who jayLANG: C++TASK: crypt1*/#include<stdio.h>bool h

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

购买磨轮平衡机时应该注意什么问题和技巧

在购买磨轮平衡机时,您应该注意以下几个关键点: 平衡精度 平衡精度是衡量平衡机性能的核心指标,直接影响到不平衡量的检测与校准的准确性,从而决定磨轮的振动和噪声水平。高精度的平衡机能显著减少振动和噪声,提高磨削加工的精度。 转速范围 宽广的转速范围意味着平衡机能够处理更多种类的磨轮,适应不同的工作条件和规格要求。 振动监测能力 振动监测能力是评估平衡机性能的重要因素。通过传感器实时监