声明

关于科学道理都会放进代码中,但是我们需要先了解一下位运算解这道题目的基础知识

我不是很会专业词语,所以仅介绍原理

位运算基础

众所周知,二进制是0和1

2^3 2^2 2^1 2^0
8 4 2 1
0 1 0 1

对应的,加出来就是5,这就是二进制转换,我利用二进制里的0和1来记录是否走过或者其他的yes/no的数据,和bool数组一样

和bool数组相比,二进制虽然位数有限,但是非常方便,很多事情不需要人为的去干.

比如将bool数组的false的部分找出来,合并两个数组之类的.非常浪费精力

怎么单独更改一位呢?

这里有一个例子:

9: 1001
2: 0010
2 + 9 = 11
2 | 9 = 11
11: 1011

代码里有一个lowbit函数

这是怎么获取最后一个为1的那一位所表示的的数值呢?

这里有一个例子,具体是关于反码与补码的:

9:  1001
-9: 0111
9&(-9) = 1
1: 0001

"理论存在,实践开始"

#include <iostream>

using namespace std;

// n:棋盘格数 ans:答案个数 all:全部位数为1的二进制,是一个工具变量
int n, ans, all;
// row:每一行默认的棋盘 (全局默认清空,但是赋值更保险(好习惯)
int row[20] = {}; // 返回最后一个为1的那一位所表示的的数值
int lowbit(int x) {
return x & (-x);
} // d:当前第几行,从0开始 col:存储列是否用过 lv:存储左对角线是否用过 rv:存储右对角线是否用过
void dfs(int d, int col, int lv, int rv){
if(d == n) {
// 能走到最后一步就记录次数
ans++;
return ;
}
// 用位运算来获取遍历的依据 别忘了row是从1开始的
int vis = all & (~(row[d + 1] | col | lv | rv));
// 简单遍历
for(int i = vis; i; i -= lowbit(i)) {
int x = lowbit(i);
// 下一步 为了适应行数的+1,对角线就要对应的左移或者右移
dfs(d + 1, col + x, (lv + x) >> 1, (rv + x) << 1);
}
} int main(){
// 零时变量,获取字符用
char t;
// 获取棋盘行列个数
cin >> n;
// 初始化为所有位数为1
all = (1 << n) - 1;
// 二位获取棋盘
for(int i = 1; i <= n; i++){
for(int j = 1; j <= n; j++){
cin >> t;
// 点为不能走(禁区)
if(t == '.') {
// 单独一行一列对应一个字节,更改即可
// 加等于也是没有问题的
row[i] |= (1<<(n - j));
}
}
}
// 开始深搜 0的所有位都为0
dfs(0, 0, 0, 0);
// 换行好习惯
cout << ans << endl;
return 0;
}

总结

题目很好,可以锻炼思维,突破传统的思维方式,打开一个新世界的大门

好久没有写过markdown,生疏了

哦吼吼,能看到这个链接就说明我的文章被爬虫爬了

请尊重原作者: https://www.cnblogs.com/dffxd/

小学四五年级可以学习到s组就是一个畸形的教育体系的体现,等国家发展起来了,吃枣药丸

[洛谷/题目] P1562 还是N皇后的更多相关文章

  1. 洛谷P1501 [国家集训队]Tree II(LCT,Splay)

    洛谷题目传送门 关于LCT的其它问题可以参考一下我的LCT总结 一道LCT很好的练习放懒标记技巧的题目. 一开始看到又做加法又做乘法的时候我是有点mengbi的. 然后我想起了模板线段树2...... ...

  2. 洛谷P3203 [HNOI2010]弹飞绵羊(LCT,Splay)

    洛谷题目传送门 关于LCT的问题详见我的LCT总结 思路分析 首先分析一下题意.对于每个弹力装置,有且仅有一个位置可以弹到.把这样的一种关系可以视作边. 然后,每个装置一定会往后弹,这不就代表不存在环 ...

  3. 洛谷P4180 [Beijing2010组队]次小生成树Tree(最小生成树,LCT,主席树,倍增LCA,倍增,树链剖分)

    洛谷题目传送门 %%%TPLY巨佬和ysner巨佬%%% 他们的题解 思路分析 具体思路都在各位巨佬的题解中.这题做法挺多的,我就不对每个都详细讲了,泛泛而谈吧. 大多数算法都要用kruskal把最小 ...

  4. 洛谷U19464 山村游历(Wander)(LCT,Splay)

    洛谷题目传送门 LCT维护子树信息常见套路详见我的总结 闲话 题目摘自WC模拟试题(by Philipsweng),原题目名Wander,"山村游历"是自己搞出来的中文名. 数据自 ...

  5. 洛谷P3434 [POI2006]KRA-The Disks(线段树)

    洛谷题目传送门 \(O(n)\)的正解算法对我这个小蒟蒻真的还有点思维难度.洛谷题解里都讲得很好. 考试的时候一看到300000就直接去想各种带log的做法了,反正不怕T...... 我永远只会有最直 ...

  6. 洛谷P3459 [POI2007]MEG-Megalopolis(树链剖分,Splay)

    洛谷题目传送门 正解是树状数组维护dfn序上的前缀和,这样的思路真是又玄学又令我惊叹( 我太弱啦,根本想不到)Orz各路Dalao 今天考了这道题,数据范围还比洛谷的小,只有\(10^5\)(害我复制 ...

  7. 洛谷P2444 [POI2000]病毒(AC自动机,DFS求环)

    洛谷题目传送门 AC自动机入门--yyb巨佬的博客 AC自动机入手经典好题(虽然年代久远) 有了fail指针,trie树就不是原来的树型结构了,我们可以把它叫做trie图,由父节点向子节点连的边和fa ...

  8. 洛谷P3796 【模板】AC自动机(加强版)(AC自动机)

    洛谷题目传送门 先膜一发yyb巨佬 orz 想学ac自动机的话,推荐一下yyb巨佬的博客,本蒟蒻也是从那里开始学的. 思路分析 裸的AC自动机,这里就不讲了.主要是这题太卡时了,尽管时限放的很大了.. ...

  9. 洛谷P2633 Count on a tree(主席树,倍增LCA)

    洛谷题目传送门 题目大意 就是给你一棵树,每个点都有点权,每次任意询问两点间路径上点权第k小的值(强制在线). 思路分析 第k小......又是主席树了.但这次变成树了,无法直接维护前缀和. 又是树上 ...

  10. 洛谷P2617 Dynamic Ranking(主席树,树套树,树状数组)

    洛谷题目传送门 YCB巨佬对此题有详细的讲解.%YCB%请点这里 思路分析 不能套用静态主席树的方法了.因为的\(N\)个线段树相互纠缠,一旦改了一个点,整个主席树统统都要改一遍...... 话说我真 ...

随机推荐

  1. 【学习笔记】开源库之 - sigslot (提供该库存在对象拷贝崩溃问题的解决方案)

    介绍说明 学习 QT 的时候,觉得 QT 提供的信号槽机制非常有用,这种机制可以解决对象与对象之间通信中的耦合问题,原本想从网络上了解一下具体的实现思路用于项目中,意外的发现了用 C++ 实现的信号槽 ...

  2. (Newtonsoft)Json增删改查

    public static class JsonHelper { #region 字段 private static string json; public static string path; # ...

  3. Pytest插件pytest-assume多重断言

    Pytest插件pytest-assume多重断言 背景 import pytest def test_assume1(): assert 1 == 2 print('hello') assert 2 ...

  4. MongoDB Compass的安装及使用图文说明(非常详细)

    1.下载 MongoDB Compass 预编译二进制包下载地址:https://www.mongodb.com/try/download/compass 2.安装 MongoDB Compass 的 ...

  5. JavaScript 日期和时间的格式化

    一.日期和时间的格式化 1.原生方法 1.1.使用 toLocaleString 方法 Date 对象有一个 toLocaleString 方法,该方法可以根据本地时间和地区设置格式化日期时间.例如: ...

  6. echarts在移动端上tooltip弹框点击空白不能关闭的问题解决方案

    1.首先新建一个mixin.js文件 export const mixinAutoHideTooltip = { mounted() { this.mAutoHideTooltip(this.$el) ...

  7. JZOJ 5451.Genocide

    题目 题解 对于 \(m=1\) 这档分 我们可以 \(dp\) 然后斜率优化 具体来说就是 \(f_i = f_j + \frac{(i-j)\times (i-j+1)}{2} + sum[j]- ...

  8. Ubuntu20.04获取root权限并用root用户登录

    Ubuntu20.04获取root权限并用root用户登录 转载csdn:静水流深深深! https://blog.csdn.net/qq_42372079/article/details/11758 ...

  9. MATH026th: 《古今算学丛书》目录

    http://aiguji.net/2202.html 出版时间: 光绪二十四年(1898)上海算学书局据微波榭本等石印 <古今算学丛书>,刘铎辑,有光绪二十四年(1898)上海算学书局石 ...

  10. Column count doesn't match value count at row 1存储的数据与数据库表的字段类型定义不相匹配

    一.造成这个原因可能是一个关于创建json数据类型的mysql表格插入的一个报错提示: 26行为错误示范:27是正确书写规范.