N皇后(正常回溯法 位运算法)

2023-11-09 06:59
文章标签 皇后 正常 回溯 运算法

本文主要是介绍N皇后(正常回溯法 位运算法),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

n皇后(两种解法)

  • 1.正常回溯法
  • 2.位运算法

1.正常回溯法

num[i] 用来保存第i行时的列数
vis[i] 为1时第i列无法放置 为0时第i列能放置
每次从一行搜索到下一行满足条件的点,直到结束
最后回溯回来

#include <iostream>
#include <cstdio>
#include <cstring>using namespace std;
const int M = 15;
int num[M]; // num[i]表示第i行时的列数
bool vis[M];
int n;int dfs(int x, int y) {if (x == n) return 1;int temp = 0;for (int i = 1; i <= n; ++i) {bool flag = false;for (int j = 1; j <= x; ++j) {if (abs(num[j] - i) == (x + 1 - j)) {flag = true;break;}}if (!flag && !vis[i]) {vis[i] = true;num[x + 1] = i;temp += dfs(x + 1, i);vis[i] = false;num[x + 1] = 0;}}return temp;
}void Solve(int n) {int ans = 0;for (int i = 1; i <= n; ++i) {vis[i] = true;num[1] = i;ans += dfs(1, i);vis[i] = false;num[1] = 0;}printf("%d\n", ans);
}int main() {while (scanf("%d", &n)) {if (n == 0) break;Solve(n);}return 0;
}

2.位运算法

l:每次将新加入的点的左侧的点加入其中,每一次向下寻找时,进行一次左移,可以想到每次向下一行时,那么不能放置的点为当前点的左下方的那个点这个点能与之前的点连成一条45度线,1表示可以摆放,0表示不可以摆放
r:同l
num:所有能够被放满的列数
now:当前已经放置的列数,当全部列数放满(now == num)就是一种可行解

#include <cstdio>int n, num, ans;int lowbit(int x) { return x & (-x); } // 树状数组中lowbit操作 用来求出最后一个可以放置的位置void Solve(int now, int l, int r) {if (now == num) {ans++;return;}int temp = num & ~(now | l | r); // 当前能够放置的位置while (temp) {int low = lowbit(temp);temp -= low;Solve(now + low, (l + low) << 1, (r + low) >> 1);}
}int main() {while (scanf("%d", &n)) {if (!n) break;ans = 0;num = (1 << n) - 1;Solve(0, 0, 0);printf("%d\n", ans);}return 0;
}

这篇关于N皇后(正常回溯法 位运算法)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

安卓链接正常显示,ios#符被转义%23导致链接访问404

原因分析: url中含有特殊字符 中文未编码 都有可能导致URL转换失败,所以需要对url编码处理  如下: guard let allowUrl = webUrl.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) else {return} 后面发现当url中有#号时,会被误伤转义为%23,导致链接无法访问

题目1254:N皇后问题

题目1254:N皇后问题 时间限制:1 秒 内存限制:128 兆 特殊判题:否 题目描述: N皇后问题,即在N*N的方格棋盘内放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在同一斜线上。因为皇后可以直走,横走和斜走如下图)。 你的任务是,对于给定的N,求出有多少种合法的放置方法。输出N皇后问题所有不同的摆放情况个数。 输入

回溯——9.全排列

力扣题目链接 给定一个 没有重复 数字的序列,返回其所有可能的全排列。 示例: 输入: [1,2,3]输出: [ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1] ] 解题思路 问题建模:题目要求给出一个数组的所有排列组合,属于典型的全排列问题,这可以用回溯法来解决。回溯法通过递归的方式,依次将数组中的每个元素放入排列中,直到生成

物联网之流水LED灯、正常流水灯、反复流水灯、移动流水灯

MENU 硬件电路设计软件程序设计正常流水LED灯反复流水LED灯移动流水LED灯 硬件电路设计 材料名称数量直插式LED1kΩ电阻杜邦线(跳线)若干面包板1 每一个LED的正极与开发板一个GPIO引脚相连,并串联一个电阻,负极接GND。 当然也可以选择只使用一个电阻。 软件程序设计 正常流水LED灯 因为要用到多个GPIO引脚,所以最好把所有的GPI

代码训练营 Day26 | 47.排序II | 51. N-皇后 |

47.排序II 1.跟46题一样只不过加一个树层去重 class Solution(object):def backtracking(self,nums,path,result,used):# recursion stopif len(path) == len(nums):# collect our setresult.append(path[:])return for i in range(

风控系统之指标回溯,历史数据重跑

个人博客:无奈何杨(wnhyang) 个人语雀:wnhyang 共享语雀:在线知识共享 Github:wnhyang - Overview 回顾 默认你已经看过之前那篇风控系统指标计算/特征提取分析与实现01,Redis、Zset、模版方法。 其中已经介绍了如何利用redis的zset结构完成指标计算,为了方便这篇文章的介绍,还是在正式开始本篇之前回顾一下。 时间窗口 zset

在Webmin上默认状态无法正常显示 Mariadb V11.02及以上版本

OS: Armbian OS 24.5.0 Bookworm Mariadb V11.02及以上版本 Webmin:V2.202 小众问题,主要是记录一下。 如题 Webmin 默认无法 Mariadb V11.02及以上版本 如果对 /etc/webmin/mysql/config 文件作相应调整就可以再现Mariadb管理界面。 路径+文件:/etc/webmin/mysql/config

关于iReport5.6.0无法正常启动或者闪退或者JDK8不兼容的解决方案

我下载了iReport5.6.0 版本的,启动不起来;jdk 1.8 下载iReport5.6.0地址:https://download.csdn.net/download/u013456370/10589765 参考链接:https://blog.csdn.net/erlian1992/article/details/76359191?locationNum=6&fps=1 如果是停留在这

165-Stamps【回溯】

回溯 给h和k的意思是在k种邮票中选h个邮票 基本的连续邮资问题 15226160 165 Stamps Accepted C++ 0.062 2015-03-27 07:21:37 #include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int maxn = 2

JAVA学习-练习试用Java实现“N皇后 II”

问题: n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。 给定一个整数 n ,返回 n 皇后问题不同的解决方案的数量。 示例 1: 输入:n = 4 输出:2 解释:如上图所示,4 皇后问题存在两个不同的解法。 示例 2: 输入:n = 1 输出:1 提示: 1 <= n <= 9 皇后彼此不能相互攻击,也就是说:任何两个皇后都不能处于同