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 ...
随机推荐
- 用原生JS和html5进行视频截图并保存到本地
<!doctype html> <html> <head> <meta charset="utf-8"> <title> ...
- java线程游戏之背景图片的移动
package com.plane; import java.awt.Graphics; import java.awt.Image; import javax.swing.ImageIcon; im ...
- ActiveMQ (三) Spring整合JMS入门
Spring整合JMS入门 前提:安装好了ActiveMQ ActiveMQ安装 Demo结构: 生产者项目springjms_producer: pom.xml <?xml versio ...
- Quartz_1_简单编程式任务调度使用(SimpleTrigger)
最近在工作中,要做定时任务的更能,最开始的时候,想到的是 JavaSE 中,自带 Timer 及 TimerTask 联合使用,完成定时任务.最后发现,随着业务的复杂,JDK 中的 Timer 和 T ...
- css知多少(10)——display(转)
css知多少(10)——display 1. 引言 网页的所有元素,除了“块”就是“流”,而且“流”都是包含在“块”里面的(最外层的body就是一个“块”).在本系列一开始讲<浏览器默认样式 ...
- css知多少(1)——我来问你来答(转)
css知多少(1)——我来问你来答 1. 引言 各位前端或者伪前端(比如作者本人)的同志们,css对你们来说不是很陌生.比如我,在几年之前上大学的时候,给外面做网站就用css,而且必须用css.这 ...
- c#与Java事件定义的不同
C#: using System; using System.Collections.Generic; using System.Text; namespace Test1 { class Progr ...
- ARC059F
传送门 分析 见ptx大爷博客 代码 #include<iostream> #include<cstdio> #include<cstring> #include& ...
- 删除GHOST中win7桌面IE删不掉的解决办法
打开Win+R 运行regedit 依次打开: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Deskto ...
- Advanced WordCount
Github:https://github.com/Hoyifei/SQ-T-Homework-WordCount-Advanced (注:Github上的所有代码由我代为提交) PSP:(注:部分实 ...