emm。。。挺秀的。。。挺神的?


每行,每列,每宫用一个二进制数表示选或没选的状态,刚开始设没选为1,然后更改状态的时候异或一下就好了;

这样可以通过lowbit取出每一个没有选过的数;(妙啊?

关于剪枝:每次选状态数最小的位置(就是能选择的数少的位置)去向下搜索(需要预处理出每个数代表的状态能选择的数)


记着把我的读入改了。。我的读入好像有问题。。。反正交上去就WA了,但scanf没事,,,,,麻烦大佬指明一下错误QAQ。。。

#include<cstdio>
#include<iostream>
#define lbt(x) (x&-x)
#define cal(i,j) ((i/3)*3+(j/3))
#define R register int
using namespace std;
inline void gstr(char* s) {
register char ch; while(isspace(ch=getchar()));
do *s++=ch; while(!isspace(ch=getchar()));
}
int h[],l[],e[],cnt[],lg[],tot;
char a[][];
inline void f(int i,int j,int x) {h[i]^=<<x,l[j]^=<<x,e[cal(i,j)]^=<<x;}
bool dfs(int crt) {
if(crt==) return true;
R tmp=,x,y;
for(R i=;i<;++i) for(R j=;j<;++j) {
if(a[i][j]!='.') continue;
R vl=h[i]&l[j]&e[cal(i,j)];
if(!vl) return false;
if(cnt[vl]<tmp) tmp=cnt[vl],x=i,y=j;//找到状态量最少的位置
} R vl=h[x]&l[y]&e[cal(x,y)];
for(;vl;vl-=lbt(vl)) { R z=lg[lbt(vl)];
a[x][y]=''+z; f(x,y,z);
if(dfs(crt-)) return true;
f(x,y,z); a[x][y]='.';
} return false;
}
signed main() {
for(R i=;i<<<;++i) for(R j=i;j;j-=lbt(j)) ++cnt[i];
for(R i=;i<;++i) lg[<<i]=i; register char s[];
while(gstr(s),s[]!='e') {
for(R i=;i<;++i) for(R j=;j<;++j) a[i][j]=s[i*+j];
for(R i=;i<;++i) h[i]=l[i]=e[i]=(<<)-; tot=;
for(R i=;i<;++i) for(R j=;j<;++j) if(a[i][j]!='.') f(i,j,a[i][j]-'');
else ++tot; dfs(tot);
for(R i=;i<;++i) for(R j=;j<;++j) s[i*+j]=a[i][j]; printf("%s\n",s);
}
}

2019.04.26

POJ3074 Sudoku 剪枝深(神?)搜的更多相关文章

  1. POJ3074 Sudoku

    POJ3074 Sudoku 与POJ2676相比,这一题搜索时每一步都找到最好确定的点进行枚举 对于每行.每列.每个九宫格,都分别用一个9位二进制数保存还有那些数还可以填 对于每个位置,将其所在行. ...

  2. UESTC - 1222 Sudoku(深搜)

    Yi Sima was one of the best counselors of Cao Cao. He likes to play a funny game himself. It looks l ...

  3. POJ 2676 Sudoku(深搜)

    Sudoku Time Limit : 4000/2000ms (Java/Other)   Memory Limit : 131072/65536K (Java/Other) Total Submi ...

  4. Sudoku (剪枝+状态压缩+预处理)

    [题目描述] In the game of Sudoku, you are given a large 9 × 9 grid divided into smaller 3 × 3 subgrids. ...

  5. POJ3074 Sudoku(lowbit优化搜索)

    In the game of Sudoku, you are given a large 9 × 9 grid divided into smaller 3 × 3 subgrids. For exa ...

  6. POJ3074 Sudoku —— Dancing Links 精确覆盖

    题目链接:http://poj.org/problem?id=3074 Sudoku Time Limit: 1000MS   Memory Limit: 65536K Total Submissio ...

  7. POJ3074 Sudoku 舞蹈链 DLX

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目(传送门) 题意概括 给出一个残缺的数独,求解. 题解 DLX + 矩阵构建  (两个传送门) 代码 #include & ...

  8. [poj3074]Sudoku(舞蹈链)

    题目链接:http://poj.org/problem?id=3074 舞蹈链精确覆盖的经典题目,一个数独每个位置的要求,可以得到以下四个约束1.每个位置有且只有一个数字2.每个位置的数字在一行只能出 ...

  9. POJ 1167 The Buses 暴搜+剪枝

    思路: 先把能选的路线都预处理出来 按照能停的车的多少排个序 (剪枝1) 搜搜搜 如果当前剩的车÷当前能停车的多少+deep>=ans剪掉 (剪枝2) //By SiriusRen #inclu ...

随机推荐

  1. 【274】Python 相关问题

    一.中文编码   参考:Python 中文编码 Python中默认的编码格式是 ASCII 格式,在没修改编码格式时无法正确打印汉字,所以在读取中文时会报错. 解决方法为只要在文件开头加入如下代码,任 ...

  2. python中注释的书写

    与c和c++的//不同的是,在python中我们使用#来进行注释 每个#所在的那一行都可以叫做注释:

  3. hibernate学习笔记(3)hibernate常用配置以及session对象

    更改hibernate.cfg.xml的内容,常用配置有: <!--  把hibernate运行时的SQL语句显示到控制台  --> <property name="sho ...

  4. 【Android异常】The specified child already has a parent. You must call removeView() on the child's parent first.

    错误信息: Caused by: java.lang.IllegalStateException: The specified child already has a parent. You must ...

  5. powerdesigner自动将name填充到注释的脚本

    我在建模的时候,希望在生成脚本的时候有注释,所以才会看到Comment列,实际上,只要你的表中的Name列不为空,运行下面的VBScript,PD会帮你自动填充注释的Comment列值. '把pd中那 ...

  6. __get(),__set(),__isset(),__unset()

    __get(),__set(),__isset(),__unset() 在给不可访问属性赋值时,__set()会被调用读取不可访问属性的值时,__get()会被调用 当对不可访问属性调用isset() ...

  7. 内核文件ntoskrnl.exe,ntkrnlpa.exe的区别??

    除了标题中说到的两个exe文件之外,还有另外两个ntkrnlmp.exe和ntkrpamp.exe.因为我目前用到的只是标题中的两个. 其中,我在网上搜索到的关于SSDT HOOK 的资料,举的例子, ...

  8. ZROI #88

    传送门 分析 我们考虑把每个A[i]考虑为山峰的高度,每次的B考虑为海平面 于是我们知道对于A[i]和A[i-1],如果A[i-1]<A[i]则在A[i-1]<B<=A[i]时会使陆 ...

  9. 什么是MTU,如何检测和设置路由器MTU值

    最大传输单元(Maximum Transmission Unit,MTU)是指一种通信协议的某一层上面所能通过的最大数据包大小(以字节为单位).最大传输单元这个参数通常与通信接口有关(网络接口卡.串口 ...

  10. python--爬虫基础

    http://files.cnblogs.com/files/Kobe10/Python__%E7%88%AC%E8%99%AB%E5%9F%BA%E7%A1%80.pdf