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 ...
随机推荐
- C语言学习笔记--函数与指针
1. 函数类型 (1)C 语言中的函数有自己特定的类型,这个类型由返回值.参数类型和参数个数共同决定.如 int add(int i,int j)的类型为 int(int,int). (2)C 语言中 ...
- Proxy模式 代理模式
Android的 LocalWindowManager 和 WindowManagerImgl 都实现了WindowManager接口.LocalWindowManager 中保存一个WindowMa ...
- day36-hibernate检索和优化
连接查询是多表查询.
- 05 HTML字符串转换成jQuery对象、绑定数据到元素上
1 要求 将一段 HTML脚本 封装成一个字符串,将这个字符串转换成一个jQuery对象:然后将这个jQuery对象添加到指定的元素中去 2 步骤 定义字符串 var str = '<div i ...
- SQL serve 数据库--视图、事物、分离附加、备份还原
视图是数据库中的一种虚拟表,与真实的表一样,视图包含一系列带有名称的行和列数据.行和列数据用来自定义视图的查询所引用的表,并且在引用视图时动态生成. 视图只能用来查询,不能增删改:不允许出现重复列 ...
- Opencv Laplacian(拉普拉斯算子)
#include <iostream>#include <opencv2/opencv.hpp>#include <math.h> using namespace ...
- leetCode130. Surrounded Regions--广度优先遍历算法
Problem: Given a 2D board containing 'X' and 'O' (the letter O), capture all regions surrounded by ' ...
- Java接口基础
接口(interface) 1.接口体中包含常量的声明(没有变量)和抽象方法两部分.接口体中只有抽象方法,没有普通的方法,而且接口体中所有的常量访问权限一定是public,而且是static常量(允许 ...
- Bootstrap 的 Tooltip 和 Popover
简介 Tooltip 指提示框,Popover 指弹出框. Tooltip 默认 Tooltip 功能是关闭的,使用前要手动开启. $(function () { $('[data-toggle=&q ...
- ElasticSearch安装拼音插件(pinyin)
环境介绍 集群环境如下: Ubuntu14.04 ElasticSearch 2.3.1(3节点) JDK1.8.0_60 开发环境: Windows10 JDK 1.8.0_66 Maven 3.3 ...