N皇后问题的解法

int sum = 0; //总的方案数

inline void print(int count)

{

for (int i = 0; i < count; i++)

{

int k = queenPos[i];

for (int j = 0; j < count; j++)

{

if (j == k)

cout << i + 1 << ’ ';

else

{

cout << "0 ";

}

}

cout<<endl;

}

cout<<“----------------\n”;

}

inline void NQueen(int k, int n)

{

//查询第k行皇后的位子,在0~k-1行的皇后都已经摆好了 一共0~n-1行 n个皇后

if (n == k) //n个已经摆好了

{

print(n);// 说明一种摆法已经完成,进行打印

sum++;

return;

}

for (int i = 0; i < n; i++) //逐渐尝试第k个皇后的位子,一共n列,每一列都会尝试。无论成功不成功

{

int j;

for (j = 0; j < k; j++) //与已经摆好的比较,

{

if (queenPos[j] == i || abs(queenPos[j] - i) == abs(k-j))//冲突检验

break;

}

if (j == k)

{ //没有出现冲突,

queenPos[k] = i; //将第k行的皇后放在第i列

NQueen(k + 1, n); //寻找第k+1行的皇后摆放位置。

}

}

}

int main()

{

int n;

cin >> n;

NQueen(0, n); //从第0行的皇后开始找起。

cout<<“总方案数为:”<<sum<<endl;

return 0;

}

递归回溯的方法,容易理解,但在时间开销上,却不小,这里推荐一种对时间优化更快的算法。

位运算求解n皇后

void test(int row, int ld, int rd)

{

intpos, p;

if( row != upperlim )

{

pos= upperlim & (~(row | ld | rd ));

while( pos )

{

p= pos & (~pos + 1);

pos= pos - p;

test(row| p, (ld | p) << 1, (rd | p) >> 1);

}

}

else

++Ans;

}

大神给的完整代码+详细备注:

#include “iostream”

using namespace std;

#include “time.h”

// sum用来记录皇后放置成功的不同布局数;upperlim用来标记所有列都已经放置好了皇后。

long sum = 0, upperlim = 1;

// 试探算法从最右边的列开始。

void test(long row, long ld, long rd)

{

if(row != upperlim)

{

//row,ld,rd进行“或”运算,求得所有可以放置皇后的列,对应位为0,

// 然后再取反后“与”上全1的数,来求得当前所有可以放置皇后的位置,对应列改为1

//也就是求取当前哪些列可以放置皇后

longpos = upperlim & ~(row | ld | rd);

while(pos) // 0 – 皇后没有地方可放,回溯

{

//拷贝pos最右边为1的bit,其余bit置0

//也就是取得可以放皇后的最右边的列

longp = pos & -pos;

//将pos最右边为1的bit清零

//也就是为获取下一次的最右可用列使用做准备,
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:前端)

最后

前端校招精编面试解析大全点击这里获取完整版pdf查看

节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!**

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:前端)

最后

前端校招精编面试解析大全点击这里获取完整版pdf查看

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值