一般解法

  • 算法思路:

    • 对于所有的位置,判断能不能放;

    • 能放就放,处理;

    • 不可行,回溯;

  • 剪枝:

    • 不能在同一行

    deep++;

    • 不能在同一列

    • 不能在同一斜线

      check k;
      for(i = 1; i <= deep; i++)
      col[i] != k; //同行
      abs(i - deep) != abs(col[i] - k);//同斜线

二进制解法

row : 置1的位置表示当前列被占用 , 如 0 0 0 0 1

ld : 置1的位置表示当前左斜线被占用 , 如 0 0 0 1 0

rd : 置1的位置表示当前右斜线被占用 , 如 0 0 0 0 0

0 0 0 0 0        0 0 0 0 1        0 0 1 0 1        1 0 1 0 1
0 0 0 0 0 ---> 0 0 0 1 0 ---> 0 1 1 0 0 ---> 1 1 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1 1 0 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 0 0 1 0 0 0 0 0 0 0 1 0
. . . .
// 从右侧的列开始 向左判

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <algorithm>
#include <queue>
#include <map>
#include <stack>
#include <deque>
#include <iostream>
using namespace std;
typedef long long LL;
const LL N = 200009; int check, sum; void test(int row, int ld, int rd)
{
int pos, p;
if (row != check)
{
pos = check & ~(row | ld | rd); //获得所有可以放的位置 while (pos) //从右向左尝试所有可以放的位置
{
p = pos & (~pos + 1); // 获得当前最右侧的位置
pos -= p; // 标记该位置 test(row + p, (ld + p) << 1, (rd + p) >> 1); // 把该位加到列上去,把该位加到斜线上去后 整体平移
}
}
else
{
sum++;
}
} int main()
{
int i, j, n;
int a[15];
for (i = 1; i <= 10; i++)
{
check = (1 << i) - 1;
sum = 0;
test(0, 0, 0);
a[i] = sum;
} while(scanf("%d", &n) != EOF && n )
{
printf("%d\n", a[n]);
}
return 0;
}

已知两点,求所经过直线的斜率:

k = (x2 - x1) / (y2 - y1)

n皇后(位运算)的更多相关文章

  1. N皇后-位运算优化

    N皇后问题 时间限制: 5 Sec  内存限制: 128 MB 题目描述 魔法世界历史上曾经出现过一个伟大的罗马共和时期,出于权力平衡的目的,当时的政治理论家波利比奥斯指出:“事涉每个人的权利,绝不应 ...

  2. 【位运算经典应用】 N皇后问题

    说到位运算的经典应用,不得不说N皇后问题. 学过程序设计的都知道N皇后问题,没听过也没关系.很简单,最传统的的N皇后问题是这个样子的,给你一个n * n大小的board,让你放n个皇后(国际象棋),要 ...

  3. N皇后问题(位运算实现)

    本文参考Matrix67的位运算相关的博文. 顺道列出Matrix67的位运算及其使用技巧 (一) (二) (三) (四),很不错的文章,非常值得一看. 主要就其中的N皇后问题,给出C++位运算实现版 ...

  4. [CODEVS1295]N皇后(位运算+搜索)

    题目描述 Description 在n×n格的棋盘上放置彼此不受攻击的n个皇后.按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子.n后问题等价于再n×n的棋盘上放置n个皇后,任 ...

  5. N皇后解法以及位运算优化

    N皇后解法以及位运算优化 观察棋盘,要求皇后之间不能处在同行同列同一条斜线,求使得每行都有一个皇后的放置方法共有多少种. 每尝试放置一个皇后,都可以把该位置所在的行.列标号用一个数组标记,含义表示该行 ...

  6. N皇后的位运算有感

    N皇后很明显是一个NP-Hard问题,如果n足够大的话,在有限较短的时间内是很难得出答案的,但是注意到N皇后(笔者认为这类问题称为棋盘问题更为贴切),在n*n棋盘之上,每个点有且只有两种状态,这与电脑 ...

  7. N皇后问题 --使用位运算解决

    关键位运算 x & (-x) 取得最低位1 x & (x-1) 去掉最低位1 class Solution(object): def totalNQueens(self, n): &q ...

  8. JavaScript 位运算总结&拾遗

    最近补充了一些位运算的知识,深感位运算的博大精深,此文作为这个系列的总结篇,在此回顾下所学的位运算知识和应用,同时也补充下前文中没有提到的一些位运算知识. 把一个数变为大于等于该数的最小的2的幂 一个 ...

  9. BZOJ 1087 互不侵犯King (位运算)

    题解:首先,这道题可以用位运算来表示每一行的状态,同八皇后的搜索方法,然后对于限制条件不相互攻击,则只需将新加入的一行左右移动与上一行相&,若是0则互不攻击,方案可行.对于每种方案,则用递推来 ...

随机推荐

  1. .NET Core 初次上手Swagger

    安装NuGet 程序包=>Swashbuckle.AspNetCore 在  Startup.ConfigureServices  方法里添加注册生成器 //注册Swagger生成器,定义一个和 ...

  2. 一.pycharm配置Pyqt开发环境

    1.安装pyqt pip install PyQt5 pip install PyQt5-tools 2.配置pycharm 2.1 配置QtDesigner Qt Designer 就是一个前端界面 ...

  3. 剑指offer-面试题16-数值的整数次方-数字

    /* 题目: 实现函数double Power(double base,int exponent), 求base的exponent次方. */ /* 思路: 本题需要考虑的情况较多: 1.0的负数次方 ...

  4. LIS 51Nod 1134 最长递增子序列

    给出长度为N的数组,找出这个数组的最长递增子序列.(递增子序列是指,子序列的元素是递增的) 例如:5 1 6 8 2 4 5 10,最长递增子序列是1 2 4 5 10.   Input 第1行:1个 ...

  5. (备份)找回 Chrome 配置

    C:\Users\xiaogezi.cn\AppData\Local\Google\Chrome\User Data\Default\ 将 Preferences 文件复制到别的地方,用于备份: 将 ...

  6. JDK 动态代理的实现

    JDK 动态代理的实现 虽然在常用的 Java 框架(Spring.MyBaits 等)中,经常见到 JDK 动态代理的使用,也知道了怎么去写一个 JDK 动态代理的 Demo,但是并不清楚实现原理. ...

  7. MySQL的修改和删除数据表字段

    MySQL的修改和删除数据表字段 写在前面: 数据库存在的意义:数据存储和数据管理. 数据库:行(数据),列(字段) 注意:本页是解决了列的字段问题.下一页是解决行的数据问题. 注意,所有的字段名,最 ...

  8. Mybatis的解析和运行原理

    Mybatis的解析和运行原理 Mybatis的运行过程大致分为两大步:第一步,读取配置文件缓存到Configuration对象,用以创建 SqlSessionFactory:第二步,SqlSessi ...

  9. 【你不知道的javaScript 上卷 笔记4】javaScript 中闭包的一些运用

    什么是闭包 闭包是javaScript语言的一种特性,在 javaScript 中以函数作为承接单元.当函数可以记住并访问所在的词法作用域时,就产生了闭包,即使函数是在当前词法作用域之外执行. fun ...

  10. java自动化测试-json返回值校验

    参考: https://blog.csdn.net/xkhgnc_6666/article/details/50250283 实现举例: