采用比特位运算改进的N皇后算法

蓝桥杯国赛真题深度解析:从动态规划到搜索剪枝的算法实战 算法竞赛的核心在于将复杂问题抽象为可计算的模型,并通过高效的数据结构与算法求解。动态规划通过状态定义与转移方程,将重叠子问题的最优解系统化求解,其关键在于状态设计与压缩,例如在网格涂色问题中,利用状态压缩DP将指数级搜索优化为多项式时间。贪心算法则依赖于局部最优选择的正确性证明,常需结合排序与二分查找进行优化,如加权区间调度问题。搜索算法(DFS/BFS)是解决组合问题的通用方法,但必须结合可行性剪枝、最优性剪枝与记忆化搜索来应对大规模状态空间。这些算法思想在蓝桥杯等编程竞赛中频繁出现,尤其在处理**动态规 阅读详情
/**//************************************************************************/
/**//* 目前最快的N皇后递归解决方法                                          */
/**//************************************************************************/
#include 
<iostream>
using namespace std;
#include 
<time.h>
long sum=0,upperlim=1;
//该算法的思想是遍历每一行(虽然算法中没有直接体现行遍历),然后对每一行中的所有
//有效列(即与上面行已放置皇后在列和左右对角线方向上不会造成冲突的列)进行尝试
//row是代表已经遍历的列,1表示该列已被皇后占有了
void GetSum(long row, long rightdiagonal, long leftdiagonal)
...
{
    
//每一列都被皇后占领了,表示该方案可行
    if (row != upperlim)
    ...
{
        
//下面进行行遍历
        
//row表示当前行中每一列放置了皇后,则该列在之后的行遍历中均不能再放置皇后了
        
//rightdiagonal表示在下一行的尝试中当前放置点的左一列位置(下一行左一列的点与当前放置
        
//点刚好形成了右对角线,会造成冲突)不可用
        
//同样的leftdiagonal表示在下一行的尝试中当前放置点的右一列(下一行右一列的点与当前放置
        
//点刚好形成了左对角线,会造成冲突)不可用
        long pos = upperlim & ~(row | leftdiagonal | rightdiagonal);
        
//这里得到该行中所有可以尝试的列(格),然后从右到左进行尝试
        
//如果遍历到的该行上的每一列已经都是无效的话则无需进行下一行的尝试了
        while (pos)
        ...
{
            
//该位操作能得到一个二进制数组中最右面的1的位置,如pos = 00010110进行如下操作之后
            
//p = 00000010,p的作用是取得当前遍历的行中所有有效列的最右面的一列(格)(其实每次取
            
//最左的列也行的)
            long p = pos & -pos;
            pos 
-= p;
            
//p代表的是当前行上放置的列,递归调用函数遍历下一行
            
//此时需将本行的尝试的列在row中标记上表明下一行不可再在此列放置皇后了
            
//同时,在下一行中本放置点的左一列和右一列也需标记为不可再放置
            GetSum(row+p, (rightdiagonal+p)<<1, (leftdiagonal+p)>>1);
        }

    }

    
else
    ...
{
        sum
++;
    }

}

int main(int argc, char *argv[])
...
{
    time_t tm; 
int n=15;
    
if(argc!=1)
        n
=atoi(argv[1]);
    tm
=time(0);
    
if((n<1)||(n>32))
    ...
{
        printf(
" heh..I can't calculate that. ");
        exit(
-1);
    }


    printf(
"%d Queens ",n);
    
//upperlim中前n位为1,用于标识探索是否已完成
    upperlim=(upperlim<<n) - 1;
    GetSum(
0,0,0);
    printf(
"Number of solutions is %ld, %d seconds ", sum,(int)(time(0)-tm));
    
return 0;
}


下面一段转的是人家用string类写的一个实现.效率较低,但是比较好懂

#include 
<iostream>
#include 
<string>
using namespace std;
//t表示被占领的行,s表示未测试过的行
void queen(const string t, const string s)
{
    
if (s=="") printf("%s  ",t.c_str());
    
else
        
//第一个for循环测试当前测试列的每一行
        for (int i=0; i<s.length(); i++) {
            
bool safe=true;
            
//第二个for循环测试当前点与之前点是否处于同一对角线上
            
//由于字符串的设计巧妙,使判断冲突情况限制在了对角线的情况上而已
            for (int j=0;j<t.length();j++)
            
{
                
//列间隔等于行间隔
                if (t.length()-j==abs(s[i]-t[j]))
                
{
                    safe
=false;
                    
break;
                }

            }

            
if (safe)
                queen(t
+s[i], s.substr(0,i)+s.substr(i+1));
        }

}


int main()
{
    
//string中的每一位代表一列,从左到右开始,而每一位中的数字代表了每一行
    
//由于每个位的数字都是唯一的,因此可以保证已测试列和待测试列之间不会有
    
//行相同的情况
    string s="01234567";
    queen(
"",s);
    exit(EXIT_SUCCESS);
    
return 0;
}


LoRA学习: SX1276/SX1277/SX1278对比 Lora芯片 SX1276/SX1277/SX1278的比较SX1276/7/8是一种半双工传输的低中频收发器,配备标了标准FSK和远距离扩频Lora调制解调器。该芯片可以用于超长距离的Lora扩频通信,并且抗干扰性强,同时达到低功耗要求。1、芯片关键参数对比: 可以看出SX1276的带宽范围为 7.8~500kHz ,扩频 因子6~12,并覆盖所有可用频段。 SX1277的带宽和频段方位与 S 阅读详情

相关推荐

桌面宠物大全 24个桌面宠物.rar

打造完美的桌面从宠物开始………………………………………………

N皇后问题及其优化

一个无关紧要的序 (欢迎跳过)我第一次看到N皇后问题 是在C++补充递归习题里.然后, 大概期中前, 老师布置了算法娱乐题, 其中有两道是跟N皇后有关的:第一个是输出(一个)符合要求的解序列, 第二个是输出解个数.第一遍撸oj的时候那个通过率简直了...再之后, 我, 踏入了满满优化探索路, 结果还是有一个sample无法在规定时间内通过. (╯‵□′)╯︵┻━┻当然, 我决定把这篇拖欠许久的CD...

EcsoBaby 4374

用Socket实现基于TCP和UDP的原理探索.pdf

用Socket实现基于TCP和UDP的原理探索.pdf用Socket实现基于TCP和UDP的原理探索.pdf

大二2个月通过中级软件设计师学习路线

软件设计师中级备考经验分享 去年我通过两三个月的努力成功通过了软件设计师中级考试。作为基础一般的考生,我想分享一下真实备考经历: 学习周期:建议至少预留2个月时间,网上所谓的"速成"并不靠谱 核心资料:B站zst_2001(炸薯条)的课程+真题刷题软件 备考策略: 上午选择题:反复记忆固定知识点 下午大题:理解原理而非死记硬背 算法题:从基础练起,如背包问题、N皇后问题 学习方法: 看视频做笔记→分类整理知识点→反复刷题修正 重点掌握计算机系统、软件工程、数据库、面向对象等核心章节 设计

2604_95920027的博客 1751

web页面 规划布局 草图绘制

主要用于web系统界面的草图快速生成。简介明了,是网页前期布局规划设计的好帮手!

维宏系统参数资料

系统的参数设置 ,方便大家学习研究。共同学习进步

使用比特位图解决八皇后问题

八皇后问题,是一个古老而著名的问题,是回溯算法的典型例题。该问题是十九世纪著名的数学家高斯1850年提出:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。 高斯认为有76种方案。1854年在柏林的象棋杂志上不同的作者发表了40种不同的解,后来有人用图论的方法解出92种结果。计算机发明后,有多种方法可以解决此问题。(百度百科)

nevasun的专栏 2692

_〖第6章:面向对象(高级)〗java_实例分析:宠物商店笔记

_〖第6章:面向对象(高级)〗_实例分析:宠物商店笔记,提炼编程能力

filemanager

filemanager 密码admin 账号admin

交友聊天源码

是一款聊天应用,可运行的一款免费源码,和大家一起学习

三菱PLC模拟仿真学习软件

是用来学习三菱PLC全系列的仿真软件,是一个电子互动教程,通过它你就可以直接用来学习三菱PLC的编程啦。

拉格朗日插值、分段线性插值、三次样条插值 C语言

这个是用C语言编的关于插值的代码,主要是三种插值方式,为拉格朗日插值法,分段线性插值法和三次样条插值法,三次样条采用追赶法。

一些 工作中 常见 英语 单词

一些 工作中 常见 英语 单词 一些 工作中 常见 英语 单词 一些 工作中 常见 英语 单词

tomcat下部署php所需的配置php环境变量包

tomcat部署php,需要配置php环境变量。将php解压到tomcat的根目录下,将文件夹名字改为php,把php.exe所在的路径加入到path中即可。

计算机操作系统实验报告,C语言实现银行家算法

C语言实现银行家算法,操作系统实验报告,附带源码与实验截图

读取h5文件

读取h5文件

wap乐购商城程序

乐购商城WAP建站程序 简单WAP商城,只要你会打字就可以建WAP商城,简单容易,易上手。 后台地址:/admin/login.asp 用户名与密码:admin

AFC自动售检票系统与人工智能AI结合的关键应用方案

针对售检票、大客流管理、设备运维及服务优化提供了可落地的技术支持和实现细节,可作为地铁智慧交通项目的实践参考

leijinquan01的博客 1513
下一篇: 信道容量的迭代算法实现
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值