Sudoku POJ - 3076 (dfs+剪枝)
Description

Write a Sudoku playing program that reads data sets from a text file.
Input
Output
Sample Input
--A----C-----O-I
-J--A-B-P-CGF-H-
--D--F-I-E----P-
-G-EL-H----M-J--
----E----C--G---
-I--K-GA-B---E-J
D-GP--J-F----A--
-E---C-B--DP--O-
E--F-M--D--L-K-A
-C--------O-I-L-
H-P-C--F-A--B---
---G-OD---J----H
K---J----H-A-P-L
--B--P--E--K--A-
-H--B--K--FI-C--
--F---C--D--H-N-
Sample Output
FPAHMJECNLBDKOGI
OJMIANBDPKCGFLHE
LNDKGFOIJEAHMBPC
BGCELKHPOFIMAJDN
MFHBELPOACKJGNID
CILNKDGAHBMOPEFJ
DOGPIHJMFNLECAKB
JEKAFCNBGIDPLHOM
EBOFPMIJDGHLNKCA
NCJDHBAEKMOFIGLP
HMPLCGKFIAENBDJO
AKIGNODLBPJCEFMH
KDEMJIFNCHGAOPBL
GLBCDPMHEONKJIAF
PHNOBALKMJFIDCEG
IAFJOECGLDPBHMNK
题意:就是让每行,每列,每个4*4的十六宫格中A~P只出现一次。输出16*16的宫格信息。
思路:我总感觉这题用dancing links会好做很多
①肯定是选择可填入的字母最少的位置开始dfs,这样分支比较少
②如果一个位置只剩一个字母可以填,就填上这个字母(废话)
③如果所有的字母不能填在该行(列、十六宫格),立刻回溯
④如果某个字母只能填在该行(列、十六宫格)的某处,立刻填写
首先除了dfs的结束条件外,一次写下对位置的②剪枝,对行,列,十六宫格的③、④剪枝,因为②、④剪枝填了一个字母,需要再次判断结束条件,
然后就是对可能性最小的位置进行dfs
(代码参考网上,侵删)
#include<iostream>
#include<string.h>
#include<cstdio> using namespace std; int maps[][];
int table[][];
int num; void put_in(int x,int y,int k)
{
num++;
maps[x][y] = k;
table[x][y] |= <<k;
for(int i=; i<=; i++)
{
table[i][y] |= <<k;
table[x][i] |= <<k;
}
int r = (x-)/*+;
int c = (y-)/*+;
for(int i=; i<; i++)
{
for(int j=; j<; j++)
{
table[r+i][c+j] |= <<k;
}
}
} int _count(int x)
{
for(int i=; x; i++)
{
if(x & )
{
if(x>> == )
return i;
return -;
}
x >>= ;
}
return -;
} int row(int x,int k)
{
int t = -;
for(int y=; y<=; y++)
{
if(maps[x][y] == k)
return -;
if(maps[x][y] >= )
continue;
if((table[x][y]&<<k) == )
{
if(t != -)
return -;
t = y;
}
}
if(t != -)
return t;
return -;
} int col(int y,int k)
{
int t = -;
for(int x=; x<=; x++)
{
if(maps[x][y] == k)
return -;
if(maps[x][y] >= )
continue;
if((table[x][y]&<<k) == )
{
if(t != -)
return -;
t = x;
}
}
if(t != -)
return t;
return -;
} void cuble(int r,int c,int k,int &x,int &y)
{
x = -;
for(int i=; i<; i++)
{
for(int j=; j<; j++)
{
if(maps[i+r][j+c] == k)
{
x=-;
return;
}
if(maps[i+r][j+c] >= )
continue;
if((table[i+r][j+c]&<<k) == )
{
if(x != -)
{
x=-;
return;
}
x = i;
y = j;
}
}
}
} int cal(int x)
{
int cnt = ;
while(x)
{
if(x&)
cnt++;
x >>= ;
}
return cnt;
} bool dfs()
{
if(num == )
{
for(int i=; i<=; i++)
{
for(int j=; j<=; j++)
{
printf("%c",maps[i][j]+'A');
}
puts("");
}
puts("");
return ;
}
for(int i=; i<=; i++)
{
for(int j=; j<=; j++)
{
if(maps[i][j] >= )
continue;
int k = _count(table[i][j]);
if(k != -)
put_in(i,j,k);
}
}
for(int x=; x<=; x++)
{
for(int k=; k<; k++)
{
int y = row(x,k);
if(y == -)
return ;
if(y != -)
put_in(x,y,k); }
}
for(int y=; y<=; y++)
{
for(int k=; k<; k++)
{
int x = col(y,k);
if(x == -)
return ;
if(x != -)
put_in(x,y,k); }
}
for(int r=; r<=; r+=)
{
for(int c=; c<=; c+=)
{
for(int k=; k<; k++)
{
int x,y;
cuble(r,c,k,x,y);
if(x == -)
return ;
if(x != -)
put_in(r+x,c+y,k); }
}
}
if(num == )
{
for(int i=; i<=; i++)
{
for(int j=; j<=; j++)
{
printf("%c",maps[i][j]+'A');
}
puts("");
}
puts("");
return ;
}
int t_num;
int t_maps[][];
int t_table[][];
t_num = num;
for(int i=; i<=; i++)
{
for(int j=; j<=; j++)
{
t_maps[i][j] = maps[i][j];
t_table[i][j] = table[i][j];
}
}
int mx,my,mn=;
for(int i=; i<=; i++)
{
for(int j=; j<=; j++)
{
if(maps[i][j]>=)
continue;
int r = - cal(table[i][j]);
if(r < mn)
{
mn = r;
mx = i,my = j;
}
}
}
for(int k=; k<; k++)
{
if((table[mx][my] & <<k) == )
{
put_in(mx,my,k);
if(dfs())
return ;
num = t_num;
for(int i=; i<=; i++)
{
for(int j=; j<=; j++)
{
maps[i][j] = t_maps[i][j];
table[i][j] = t_table[i][j];
}
}
}
}
return ;
} int main()
{
char s[];
while(~scanf("%s",s))
{
num = ;
memset(table,,sizeof(table));
for(int j=; j<=; j++)
{
if(s[j-]!='-')
put_in(,j,s[j-]-'A');
else
maps[][j] = -;
}
for(int i=; i<=; i++)
{
scanf("%s",s);
for(int j=; j<=; j++)
{
if(s[j-]!='-')
put_in(i,j,s[j-]-'A');
else
maps[i][j] = -;
}
}
dfs();
} }
Sudoku POJ - 3076 (dfs+剪枝)的更多相关文章
- POJ 3009 DFS+剪枝
POJ3009 DFS+剪枝 原题: Curling 2.0 Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 16280 Acce ...
- 2018 Multi-University Training Contest 4 Problem J. Let Sudoku Rotate 【DFS+剪枝+矩阵旋转】
任意门:http://acm.hdu.edu.cn/showproblem.php?pid=6341 Problem J. Let Sudoku Rotate Time Limit: 2000/100 ...
- Sudoku POJ - 3076
Sudoku Time Limit: 10000MS Memory Limit: 65536K Total Submissions: 5769 Accepted: 2684 Descripti ...
- HDU-6341 Problem J. Let Sudoku Rotate(dfs 剪枝)
题目:有一个4*4*4*4的数独,每一横每一竖每一个小方块中都无重复的字母,即都为0-9,A-F..有一个已经填好的数独,若干个4*4的方块被逆时针拧转了若干次,问拧转回来至少需要多少次. 分析:很明 ...
- DFS(剪枝) POJ 1011 Sticks
题目传送门 /* 题意:若干小木棍,是由多条相同长度的长木棍分割而成,问最小的原来长木棍的长度: DFS剪枝:剪枝搜索的好题!TLE好几次,终于剪枝完全! 剪枝主要在4和5:4 相同长度的木棍不再搜索 ...
- poj 1011 Sticks (DFS+剪枝)
Sticks Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 127771 Accepted: 29926 Descrip ...
- poj 1564 Sum It Up | zoj 1711 | hdu 1548 (dfs + 剪枝 or 判重)
Sum It Up Time Limit : 2000/1000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other) Total Sub ...
- (简单) POJ 3076 Sudoku , DLX+精确覆盖。
Description A Sudoku grid is a 16x16 grid of cells grouped in sixteen 4x4 squares, where some cells ...
- POJ 3076 Sudoku
3076 思路: dfs + 剪枝 首先,如果这个位置只能填一种字母,那就直接填 其次,如果对于每一种字母,如果某一列或者某一行或者某一块只能填它,那就填它 然后,对于某个位置如果不能填字母了,或者某 ...
随机推荐
- Where is NuGet in VS2017 Community?
问题:在VS2017中找不到NuGet 回答:https://stackoverflow.com/questions/43702484/where-is-nuget-in-vs2017-communi ...
- python基础教程(第二版)
开始学习python,根据Python基础教程,把里面相关的基础章节写成对应的.py文件 下面是github上的链接 python基础第1章基础 python基础第2章序列和元组 python基础第3 ...
- python - 发送带各种类型附件的邮件
如何发送各种类型的附件. 基本思路就是,使用MIMEMultipart来标示这个邮件是多个部分组成的,然后attach各个部分.如果是附件,则add_header加入附件的声明. 在python中,M ...
- linux 下安装vscode
下载安装包 https://code.visualstudio.com/docs/?dv=linux64_deb (注意是deb包) sudo dpkg -i code_1.18.1-15108573 ...
- 2。创建第一个angular应用,已经开发前的一些配置
现在我们开始新建一个angular5的脚手架 . 到想要建项目的目录下.比如我的 在 D:\JsProjects 进入cmd或者powershell cd 进入该文件夹下 然后开始新建,ng ne ...
- 网络编程—udp
一.ip地址 1. 什么是地址 地址就是用来标记地点的 2. ip地址的作用 ip地址:用来在网络中标记一台电脑,比如192.168.1.1:在本地局域网上是唯一的. 3. ip地址的分类 每一个IP ...
- tensorflow(2):神经网络优化(loss,learning_rate)
案例: 预测酸奶的日销量, 由此可以准备产量, 使得损失小(利润大),假设销量是y , 影响销量的有两个因素x1, x2, 需要预先采集数据,每日的x1,x2和销量y_, 拟造数据集X,Y_, 假设y ...
- C++ shut down a computer
前阵子有朋友问我,怎么用C语言写一个小程序,控制电脑关机.这个我真的不懂,这几天闲着,就上网搜了搜,整理一下. IDE: Code::Blocks 16.01 操作系统:Windows 7 x64 # ...
- BZoj 2301 Problem b(容斥定理+莫比乌斯反演)
2301: [HAOI2011]Problem b Time Limit: 50 Sec Memory Limit: 256 MB Submit: 7732 Solved: 3750 [Submi ...
- Asp.Net MVC Ajax轮训解决Session失效时间
这种方法不是太好,对服务器得压力大,由于系统是内部人员使用,业务有比较复杂,所以有些值得需要Session去保存,但是,Session有失效时间. 代码如下: $(function () { func ...