POJ3074 Sudoku
POJ3074 Sudoku
- 与POJ2676相比,这一题搜索时每一步都找到最好确定的点进行枚举
- 对于每行、每列、每个九宫格,都分别用一个9位二进制数保存还有那些数还可以填
- 对于每个位置,将其所在行、列、九宫格所对应的二进制数进行或运算即可得到该位置能填哪些数,用lowbit运算(取出最低的为1的数位)即可吧能填的数字取出。
- 其他见代码
#include <cstdio>
#include <cstring>
#include <queue>
#include <algorithm>
#include <iostream>
#include <cctype>
using namespace std; #define res register int
inline int read() {
int x(),f(); char ch;
while(!isdigit(ch=getchar())) if(ch=='-') f=-;
while(isdigit(ch)) x=x*+ch-'',ch=getchar();
return f*x;
}
int id[][];//打表算出i,j所在的九宫格
inline void pre_work()
{
for(res i= ; i< ; i++)
{
for(res j= ; j< ; j++) id[i][j]=;
for(res j= ; j< ; j++) id[i][j]=;
for(res j= ; j< ; j++) id[i][j]=;
}
for(res i= ; i< ; i++)
{
for(res j= ; j< ; j++) id[i][j]=;
for(res j= ; j< ; j++) id[i][j]=;
for(res j= ; j< ; j++) id[i][j]=;
}
for(res i= ; i< ; i++)
{
for(res j= ; j< ; j++) id[i][j]=;
for(res j= ; j< ; j++) id[i][j]=;
for(res j= ; j< ; j++) id[i][j]=;
}
} char str[][];
int row[],col[],grid[],cnt[],num[],tot; inline void flip(int x,int y,int z)
{
row[x]^=<<z; col[y]^=<<z;
grid[id[x][y]]^=<<z;
} bool dfs(int now)
{
if(!now) return ;
int tmp=,x,y;
//找最好算的位置
for(res i= ; i< ; i++)
for(res j= ; j< ; j++)
{
if(str[i][j]!='.') continue;
int val=row[i]&col[j]&grid[id[i][j]];//不能确定的数的个数
if(cnt[val]<tmp) {
tmp=cnt[val],x=i,y=j;
}
}
int val=row[x]&col[y]&grid[id[x][y]];
for(;val;val-=val&-val)
{
int z=num[val&-val];//要填的数
str[x][y]=''+z; //注意是1
flip(x,y,z);
if(dfs(now-)) return true;
flip(x,y,z);
str[x][y]='.';
}
return false;
} int main()
{
pre_work();
//为了减少空间,用0~8表示1~9
for(res i= ; i<<< ; i++)
for(res j=i ; j ; j-=j&-j) cnt[i]++;
for(res i= ; i< ; i++) num[<<i]=i;
char s[];
while(~scanf("%s",s) && s[]!='e')
{
for(res i= ; i< ; i++)
for(res j= ; j< ; j++) str[i][j]=s[i*+j];
for(res i= ; i< ; i++) row[i]=col[i]=grid[i]=(<<)-;
tot=;
for(res i= ; i< ; i++)
for(res j= ; j< ; j++)
if(str[i][j]!='.') flip(i,j,str[i][j]-'');//注意这里是-1,因为是0~8
else tot++;
dfs(tot);
for(res i= ; i< ; i++)
for(res j= ; j< ; j++) s[i*+j]=str[i][j];
puts(s);
} return ;
}
POJ3074 Sudoku的更多相关文章
- 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 剪枝深(神?)搜
emm...挺秀的...挺神的? 每行,每列,每宫用一个二进制数表示选或没选的状态,刚开始设没选为1,然后更改状态的时候异或一下就好了: 这样可以通过lowbit取出每一个没有选过的数:(妙啊? 关于 ...
- [poj3074]Sudoku(舞蹈链)
题目链接:http://poj.org/problem?id=3074 舞蹈链精确覆盖的经典题目,一个数独每个位置的要求,可以得到以下四个约束1.每个位置有且只有一个数字2.每个位置的数字在一行只能出 ...
- 【转】Dancing Links题集
转自:http://blog.csdn.net/shahdza/article/details/7986037 POJ3740 Easy Finding [精确覆盖基础题]HUST1017 Exact ...
- Dancing Links 专题总结
算法详细:Dancing Links博客 1.精确覆盖: ZOJ3209 Treasure Map HUST1017 Exact cover POJ3074 Sudoku 2.可重复覆盖: HDU22 ...
- dancing links 题集转自夏天的风
POJ3740 Easy Finding [精确覆盖基础题] HUST1017 Exact cover [精确覆盖基础] HDOJ3663 Power Stations [精确覆盖] Z ...
- 【POJ3074】Sudoku DLX(Dancing Links)
数独就要DLX,不然不乐意. 数独的DLX构造:9*9个点每一个点有9种选择,这构成了DLX的729行,每行.列.阵有限制,均为9行(/列/阵),然后每行(/列/阵)都有九种数的情况.于是就有了3*9 ...
随机推荐
- Io 异常: The Network Adapter could not establish the connection解决方案
Io 异常: The Network Adapter could not establish the connection解决方案 2016年06月04日 13:30:21 阅读数:46589 Io ...
- VIO系统的IMU与相机时间偏差标定
视觉里程计(VIO)作为一种空间定位方法,广泛应用于VR/AR.无人驾驶和移动机器人,比如近年火热的苹果 AR-Kit和谷歌AR-Core都使用了VIO技术进行空间定位.通常,VIO系统忽略IMU ...
- MyBatis 3(中文版) 第四章 使用注解配置SQL映射器
本章将涵盖以下话题: l 在映射器Mapper接口上使用注解 l 映射语句 @Insert,@Update,@Delete,@SeelctStatements l 结果映射 一对一映射 一对多映射 l ...
- Linux下软件常见安装方式
pasting 分类: Linux2007-12-08 16:31 1909人阅读 评论(0) 收藏 举报 linuxredhat脚本文档managerfile Linux下软件安装主 ...
- 实践作业3:白盒测试----总结与反思DAY12.
---恢复内容开始--- 阶段一:熟悉白盒测试方法 负责人:刘思佳 工作质量评价:用例设计详细,考虑到白盒测试基于代码,所以尽可能地覆盖更多的白盒测试方法,对系统可能存在的缺陷就更容易了解.对管理员和 ...
- windows server2012如何开启mysql远程登录
开发的首要任务就是要搭建起自己的服务器,下面主要是我这搭建记录下 我的各种环境 服务器为Windows server2012 安装的MySQL数据的版本是5.6.10 ,64位.当然了版本对于安装没 ...
- CentOS 7搭建FTP服务器
安装vsftpd 命令:yum -y install vsftpd 修改ftp配置文件 命令:vim /etc/vsftpd/vsftpd.conf 按i进入insert模式后,按以下要求修改 ano ...
- 大前端涉猎之前后端交互总结1: 软件架构与PHP搭建
1 软件架构与PHP搭建 1.1 HTTP服务器(web服务器) 即( web服务器 )网站服务器,主要提供文档(文本.图片.视频.音频)web浏览服务,一般安装Apache.Nginx服务器软件. ...
- javascript总结39:DOM 中常用的表单元素的属性
1 常用操作元素: value 用于大部分表单元素的内容获取(option除外) type 可以获取input标签的类型(输入框或复选框等) disabled 禁用属性 checked 复选框选中属性 ...
- LightOJ 1268 Unlucky Strings (KMP+矩阵快速幂)
题意:给出一个字符集和一个字符串和正整数n,问由给定字符集组成的所有长度为n的串中不以给定字符串为连续子串的有多少个? 析:n 实在是太大了,如果小的话,就可以用动态规划做了,所以只能用矩阵快速幂来做 ...