Sudoku(POJ2676/3074)
Sudoku is one of the metaphysical techniques. If you understand the essence of it, you will have the feeling of being immortal, laughing and laughing with joy.............................................................(audience:"We need't such a geomancer!You can get out!!")
Oh,I'm sorry.Then let's getting down to business as quickly as possible.
The meaning of the problem isn't hard for us to understand.And it is more friendly to those who have played sudoku.But don't worry if you didn't heard about this kind of game,for there's few skills of formal competition.What you have to do is to memorize its basic rules.
OK.Now,let's think of the solution of this problem.You may want to enumerate all the alternative numbers in the blanks,then check if it's lawful.Good!it's the first algorithm we've thought of.But there's great room for progress.In fact,when people play sudoku,they will write down candidates in each blank.We can record which number we can use in one blank and try using it.To realize it,we can use state compression to save alternative numbers in each row,column and gong.After that,we can choose the blank which has the least candidates to have test-fill until all the blanks are filled.Don't forget to flash back after updating.
Up to now,we are able to pass POJ2676,but there's still some distance from passing POJ3074.Think of how we search for the blank which has the least candidates and the use of lowbit.We can use an array to record the position of 1 in lowbit(x),and another one array to preprocess the number of 1 in each binary number.My code is below.
After you get AC in these two sudokus,you can have a try in a harder promblem POJ3076.But you need a more skillful way.Can you find it?
#include<bits/stdc++.h> using namespace std; int row[],column[],house[][],h[],cnt[];
char a[][],c;
bool flag; inline int getchoice(int x,int y){
return row[x]&column[y]&house[x/+][y/+];
} inline int lowbit(int x){
return x&-x;
} void dfs(int x,int y){
if(flag) return;
if(x==){
for(int i=;i<=;i++)
for(int j=;j<=;j++) cout<<a[i][j];
cout<<endl;
flag=true;
return;
}
int hx=x/+,hy=y/+;//判断(x,y)在哪一宫
int choice=getchoice(x,y);
while(choice){
int num=lowbit(choice);
choice-=num;
int row0=row[x],column0=column[y],house0=house[hx][hy];
row[x]&=~num;column[y]&=~num;house[hx][hy]&=~num;
a[x][y]=h[num]+'';
int minn=,xx=,yy;
for(int i=;i<=;i++)
for(int j=;j<=;j++){
if(a[i][j]!='.') continue;
int cal=cnt[getchoice(i,j)];
if(cal<minn){
xx=i;yy=j;
minn=cal;
}
}
dfs(xx,yy);
row[x]=row0;column[y]=column0;house[hx][hy]=house0;
}
a[x][y]='.';
} int main(){
for(int i=;i<=;i++) h[<<i]=i;//预处理lowbit(x)后x中1的位置(即2^n中n的值)
for(int i=;i<;i++)
for (int j=i;j;j-=lowbit(j))
cnt[i]++;//题解中的好方法,预处理每一个二进制数中1的数量;
cin>>c;
while(c!='e'){
for(int i=;i<=;i++)
for(int j=;j<=;j++)
row[i]=column[j]=house[i/+][j/+]=;
a[][]=c;
for(int j=;j<=;j++) scanf("%c",&a[][j]);
for(int i=;i<=;i++)
for(int j=;j<=;j++) scanf("%c",&a[i][j]);
for(int i=;i<=;i++)
for(int j=;j<=;j++)
if(a[i][j]!='.'){
int num=a[i][j]-'';
num=pow(,num);
row[i]&=~num;
column[j]&=~num;
house[i/+][j/+]&=~num;//预处理每行、每列、每宫可用的数字
}
flag=false;
int minn=,xx=,yy;
for(int i=;i<=;i++)
for(int j=;j<=;j++){
if(a[i][j]!='.') continue;
int cal=cnt[getchoice(i,j)];
if(cal<minn){
xx=i;yy=j;
minn=cal;
}
}
dfs(xx,yy);
cin>>c;
}
return ;
}
Sudoku(POJ2676/3074)的更多相关文章
- POJ 3074 Sudoku (Dancing Links)
传送门:http://poj.org/problem?id=3074 DLX 数独的9*9的模板题. 具体建模详见下面这篇论文.其中9*9的数独怎么转化到精确覆盖问题,以及相关矩阵行列的定义都在下文中 ...
- POJ 2676 Sudoku(深搜)
Sudoku Time Limit : 4000/2000ms (Java/Other) Memory Limit : 131072/65536K (Java/Other) Total Submi ...
- HDU - 5547 Sudoku(数独搜索)
Description Yi Sima was one of the best counselors of Cao Cao. He likes to play a funny game himself ...
- 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 ...
- HDU 3111 Sudoku(精确覆盖)
数独问题,输入谜题,输出解 既然都把重复覆盖的给写成模板了,就顺便把精确覆盖的模板也写好看点吧...赤裸裸的精确覆盖啊~~~水一水~~~然后继续去搞有点难度的题了... #include <cs ...
- LeetCode 36 Valid Sudoku(合法的数独)
题目链接: https://leetcode.com/problems/valid-sudoku/?tab=Description 给出一个二维数组,数组大小为数独的大小,即9*9 其中,未填入 ...
- Sudoku(简单DFS)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5547 数据比较少,直接暴力DFS,检验成立情况即可 AC代码:但是不知道为什么用scanf,print ...
- 【POJ - 2676】Sudoku(数独 dfs+回溯)
-->Sudoku 直接中文 Descriptions: Sudoku对数独非常感兴趣,今天他在书上看到了几道数独题: 给定一个由3*3的方块分割而成的9*9的表格(如图),其中一些表格填有1- ...
- sudoku 心得 视觉消除法(Visual Elimination)
虽然我是程序员,但这里只介绍人类的思维方法. 这个方法我是从这里看到的: https://www.learn-sudoku.com/visual-elimination.html Most peopl ...
随机推荐
- webpack 4.0配置
webpack一般是本地安装,一般安装webpack webpack-cli,一般是开发依赖上线的时候不需要打包通常npm install webpack webpack-cli -D安装 安装的时 ...
- gradle 排除jar包依赖
1.直接在configuration中排除 configurations { compile.exclude module: 'commons' all*.exclude group: 'org.gr ...
- .net core 获取客户端ip
1.NUGET安装 Microsoft.AspNetCore.Http 2.在 startup.cs 的 ConfigureServices 中注入 services.AddSingleton< ...
- linux搭建
1.安装rpm包 [root@lixiaojie lixiaojie]# rpm -ivh openfire-3.9.3-1.i386.rpm Preparing... ############### ...
- vue(一)vue-cli安装
第一步:我们首先要全局安装vue官方提供的脚手架工具:vue-cli $ npm install vue-cli -g 第二步:然后我们就可以创建自己的vue项目了, $ vue init webpa ...
- tensorflow源码阅读(c++)(一)
root/tensorflow/core |--common_runtime # 公共运行库 |--distributed_runtime # 分布式执行模块,含有grpc session, grpc ...
- Codeforces Round #552 (Div. 3) B题
题目链接:http://codeforces.com/contest/1154/problem/B 题目大意:给出n个数,每个数都可以加上或减去这个一个数D,求对这n个数操作之后当所有数都相等时,D的 ...
- IDEA cannot resolve symbol “xxxx”
有缓存 多试两次就可以了. 技术交流群:816227112
- 解决Dynamic Web Module 3.1 requires Java 1.7 or newer
需要检查和确认Eclipse项目属性的java版本和本地jdk的版本一致,以1.7版本为例: 1. 在 Java Build Path的libraries中修改对应的JDK版本为1.7: 2.在Jav ...
- ASP.NET Core 项目简单实现身份验证及鉴权
ASP.NET Core 身份验证及鉴权 目录 项目准备 身份验证 定义基本类型和接口 编写验证处理器 实现用户身份验证 权限鉴定 思路 编写过滤器类及相关接口 实现属性注入 实现用户权限鉴定 测试 ...