POJ3074 Sudoku 剪枝深(神?)搜
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 剪枝深(神?)搜的更多相关文章
- POJ3074 Sudoku
POJ3074 Sudoku 与POJ2676相比,这一题搜索时每一步都找到最好确定的点进行枚举 对于每行.每列.每个九宫格,都分别用一个9位二进制数保存还有那些数还可以填 对于每个位置,将其所在行. ...
- 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 ...
- POJ 2676 Sudoku(深搜)
Sudoku Time Limit : 4000/2000ms (Java/Other) Memory Limit : 131072/65536K (Java/Other) Total Submi ...
- Sudoku (剪枝+状态压缩+预处理)
[题目描述] In the game of Sudoku, you are given a large 9 × 9 grid divided into smaller 3 × 3 subgrids. ...
- POJ3074 Sudoku(lowbit优化搜索)
In the game of Sudoku, you are given a large 9 × 9 grid divided into smaller 3 × 3 subgrids. For exa ...
- POJ3074 Sudoku —— Dancing Links 精确覆盖
题目链接:http://poj.org/problem?id=3074 Sudoku Time Limit: 1000MS Memory Limit: 65536K Total Submissio ...
- POJ3074 Sudoku 舞蹈链 DLX
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目(传送门) 题意概括 给出一个残缺的数独,求解. 题解 DLX + 矩阵构建 (两个传送门) 代码 #include & ...
- [poj3074]Sudoku(舞蹈链)
题目链接:http://poj.org/problem?id=3074 舞蹈链精确覆盖的经典题目,一个数独每个位置的要求,可以得到以下四个约束1.每个位置有且只有一个数字2.每个位置的数字在一行只能出 ...
- POJ 1167 The Buses 暴搜+剪枝
思路: 先把能选的路线都预处理出来 按照能停的车的多少排个序 (剪枝1) 搜搜搜 如果当前剩的车÷当前能停车的多少+deep>=ans剪掉 (剪枝2) //By SiriusRen #inclu ...
随机推荐
- php命令行操作
1.php -v返回版本 -i选项返回安装的有关信息 -h访问帮助文件 -m列出编译到当前PHP安装的全部模块 CLI与CGI区别: 在命令行脚本环境中,有两种版本的PHP可以使用,旧版本是CGI ...
- dll注入及卸载实践
三种方法:具体详见<逆向工程核心原理>. 1.创建远程线程CreateRemoteThread() 2.使用注册表AppInit_DLLs 3.消息钩取SetWindowsHookEx() ...
- JS中的!= 、== 、!==、===的用法和区别
与c++中每一种类型都有明确的的定义不同:因JS中var定义存在,未具体区分类型,!=与==不能包含所有的条件,故加入!==与===用法: var num = 1; var str = '1'; va ...
- 算法Sedgewick第四版-第1章基础-004一封装交易对象
1. package ADT; /****************************************************************************** * Co ...
- NSWindow上添加NSView
DBSCustomView *view = [[DBSCustomView alloc] initWithFrame:NSMakeRect(100, 100, 100, 100)]; [self.wi ...
- Luogu 3625 [APIO2009]采油区域
想了很久的dp,看了一眼题解之后感觉自己被安排了. 发现从一个矩形中选择三个不相交的正方形一共只有六种取法. 那么我们可以处理出四个值: $f_{i, j}$分别表示以$(i, j)$为右下角,左下角 ...
- 5.内网渗透之PTH&PTT&PTK
---------------------------------------------- 本文参考自三好学生-域渗透系列文章 内网渗透之PTH&PTT&PTK PTH(pass-t ...
- Python--面向对象编程--时钟实例开发
在学习python面向对象编程的时候,心血来潮,决定写一个时钟模型来玩玩,所以就有了现在这个小玩意,不过python这个东西确实是挺好玩的 方法:运用python的tkinter库开发图形化时钟程序 ...
- Cookies的两种存取方式
我们在使用webview开发时,少不了和cookie打交道,在网页端我这使用的是asp.net开发的,安卓下的cookie和windows平台下还是有些不同的,后来看了看,原来有两种cookie的存取 ...
- android studio中使用x5 webview来读写cookies的问题
本人新手,刚接触AS也没有多久,记录下两个问题. 1. 怎么在android studio中写入cookies 把写入cookies的动作放在了主界面的onCreate事件中了,看了腾讯的说明,说是要 ...