Sudoku (剪枝+状态压缩+预处理)
【题目描述】
In the game of Sudoku, you are given a large 9 × 9 grid divided into smaller 3 × 3 subgrids. For example,
. 2 7 3 8 . . 1 .
. 1 . . . 6 7 3 5
. . . . . . . 2 9
3 . 5 6 9 2 . 8 .
. . . . . . . . .
. 6 . 1 7 4 5 . 3
6 4 . . . . . . .
9 5 1 8 . . . 7 .
. 8 . . 6 5 3 4 .
Given some of the numbers in the grid, your goal is to determine the remaining numbers such that the numbers 1 through 9 appear exactly once in (1) each of nine 3 × 3 subgrids, (2) each of the nine rows, and (3) each of the nine columns.
【题目链接】
【算法】
剪枝+状态压缩常数优化。好难啊。。。。
【代码】
#include <stdio.h>
using namespace std;
char G[10][10];
int row[10],col[10],grid[10],rec[512],num[512];
inline int g(int x,int y) {
return (x/3)*3+y/3;
}
inline void flip(int x,int y,int to) {
row[x]^=1<<to;
col[y]^=1<<to;
grid[g(x,y)]^=1<<to;
}
bool dfs(int cur) {
if(cur==0) return 1;
int minn=10,x,y;
for(int i=0;i<9;i++) {
for(int j=0;j<9;j++) {
if(G[i][j]=='.') {
int val=row[i]&col[j]&grid[g(i,j)];
if(!val) return 0;
if(rec[val]<minn) {
minn=rec[val],x=i,y=j;
}
}
}
}
int val=row[x]&col[y]&grid[g(x,y)];
for(;val;val-=val&-val) {
int to=num[val&-val];
G[x][y]=to+'1';
flip(x,y,to);
if(dfs(cur-1)) return 1;
flip(x,y,to);
G[x][y]='.';
}
return 0;
}
int main() {
for(int i=0;i<1<<9;i++) {
for(int j=i;j;j-=j&-j)
rec[i]++;
}
for(int i=0;i<9;i++) {
num[1<<i]=i;
}
char s[100];
while(~scanf("%s",s)&&s[0]!='e') {
for(int i=0;i<9;i++) row[i]=col[i]=grid[i]=(1<<9)-1;
int tot=0;
for(int i=0;i<9;i++) {
for(int j=0;j<9;j++) {
G[i][j]=s[i*9+j];
if(G[i][j]!='.') flip(i,j,G[i][j]-'1');
else ++tot;
}
}
dfs(tot);
for(int i=0;i<9;i++)
for(int j=0;j<9;j++)
s[i*9+j]=G[i][j];
puts(s);
}
return 0;
}
Sudoku (剪枝+状态压缩+预处理)的更多相关文章
- Codeforces 1017D The Wu(状态压缩+预处理)
题意: 给你n m q,表示在这一组数据中所有的01串长度均为n,然后给你一个含有m个元素的multiset,之后有q次询问.每次询问会给你一个01串t和一个给定常数k,让你输出串t和multiset ...
- Join The Future (剪枝 + 状态压缩)
一道暴力搜索的恶心剪枝题目. 先处理好某个点确定之后其他点的也确定的是谁,还有分别为什么情况,分别用vis,sta来记录.当然可以直接使用一个3进制数来表示,但是这里需要额外写一个三进制数求值的函数较 ...
- Chess (SG + 状态压缩预处理)
#include<bits/stdc++.h> #define bit(t) (1 << t) using namespace std; <<; ;//k是集合s的 ...
- uva 1601 poj 3523 Morning after holloween 万圣节后的早晨 (经典搜索,双向bfs+预处理优化+状态压缩位运算)
这题数据大容易TLE 优化:预处理, 可以先枚举出5^3的状态然后判断合不合法,但是由于题目说了有很多墙壁,实际上没有那么多要转移的状态那么可以把底图抽出来,然后3个ghost在上面跑到时候就不必判断 ...
- POJ2688状态压缩(可以+DFS剪枝)
题意: 给你一个n*m的格子,然后给你一个起点,让你遍历所有的垃圾,就是终点不唯一,问你最小路径是多少? 思路: 水题,方法比较多,最省事的就是直接就一个BFS状态压缩暴搜就行 ...
- 状态压缩---UVA6625 - Diagrams & Tableaux
比赛的时候刷出来的第一个状态DP.(期间有点没有把握是状态DP呢.) 题意:题意还是简单的.K行的方格.之后输入L1~LK 代表每一行方格数.在这些往左紧挨的方格子里填上1~N的数字. 其中右边格子的 ...
- hrbust1841再就业(状态压缩dp)
本人刚学压缩dp,只能对这些水题写题解 一方面对自己的理解有加深作用 另一方面希望和各位大牛交流交流..... 如果有对状态dp不太了解的童鞋可以参考入门知识:http://wenku.baidu.c ...
- ACM/ICPC 之 BFS+状态压缩(POJ1324(ZOJ1361))
求一条蛇到(1,1)的最短路长,题目不简单,状态较多,需要考虑状态压缩,ZOJ的数据似乎比POj弱一些 POJ1324(ZOJ1361)-Holedox Moving 题意:一条已知初始状态的蛇,求其 ...
- topcoder-srm701-div2-900 博弈\计算二进制位1的个数\dp\状态压缩
借用一下qls翻译过来的题面 现在有 n 个石子,A 和 B 轮流取石子,A先,每次最多可以取 m 个石子,取到最后一个石子的人获胜,但是某个人如果取完石子时候剩余石子数的二进制表示中有奇数个1,这 ...
随机推荐
- ZROI 19.07.28 组合计数/lb
T1 题意:\(n\)个变量,\(0 \leq x_i \leq c_i\),求\(\sum x_i = A\)方案数.\(n \leq 32\). Sol: \(n \leq 10\)的时候容斥很水 ...
- Apache+Mysql+PHP 套件
Apache+Mysql+PHP 套件 最近要装个Apache+Mysql+PHP的一个环境. google下后,发现现在的安装变得越来越简单了.不再需要麻烦的配置安装,只需简单执行个sh就搞定了 ...
- Git之仓库管理
介绍以及安装: Git 是一个开源的分布式版本控制软件,用以有效.高速的处理从很小到非常大的项目版本管理. Git 最初是由Linus Torvalds设计开发的,用于管理Linux内核开发.Git ...
- 【leetcode】1131. Maximum of Absolute Value Expression
题目如下: Given two arrays of integers with equal lengths, return the maximum value of: |arr1[i] - arr1[ ...
- celery在项目中的使用
1 关于celery是一个处理异步耗时任务的框架 由 worker 和broker 和store 3部分组成 worker是来处理消息的工人 broker是来存储请求消息的仓库 store是用来存储结 ...
- luogu 2491 [SDOI2011]消防 / 1099 树网的核 单调队列 + 树上问题
Code: #include<bits/stdc++.h> #define ll long long #define maxn 300001 #define inf 1000000000 ...
- Spring——IOC与Bean容器
[IOC] (1)IOC:控制反转,控制权的转移,应用程序本身不负责依赖对象的创建和维护,而是由外部容器负责创建和维护.也就是说由IOC容器在运行期间,动态地将某种依赖关系注入到对象之中 (2)DI: ...
- NOI 2727:仙岛求药 x
总时间限制: 1000ms 内存限制: 65536kB 描述 少年李逍遥的婶婶病了,王小虎介绍他去一趟仙灵岛,向仙女姐姐要仙丹救婶婶.叛逆但孝顺的李逍遥闯进了仙灵岛,克服了千险万难来到岛的中心,发 ...
- Vue中的MVVM框架
ViewModel:数据双向绑定 场景: 针对具有复杂交互逻辑的前段应用 提供基础的架构抽象 通过Ajax数据持久化,保证前端用户体验 什么是vue.js? 是一个轻量级的mvvm框架 数据驱动+组 ...
- Vue引入Jquery和Bootstrap
一.引入jquery包 npm i jquery 二.配置jquery 在webpack.base.conf.js中加载juery插件 所以要配置该文件 三.引入Bootstrap npm i bo ...