Description

A Sudoku grid is a 16x16 grid of cells grouped in sixteen 4x4 squares, where some cells are filled with letters from A to P (the first 16 capital letters of the English alphabet), as shown in figure 1a. The game is to fill all the empty grid cells with letters from A to P such that each letter from the grid occurs once only in the line, the column, and the 4x4 square it occupies. The initial content of the grid satisfies the constraints mentioned above and guarantees a unique solution.


Write a Sudoku playing program that reads data sets from a text file.

Input

Each data set encodes a grid and contains 16 strings on 16 consecutive lines as shown in figure 2. The i-th string stands for the i-th line of the grid, is 16 characters long, and starts from the first position of the line. String characters are from the set {A,B,…,P,-}, where – (minus) designates empty grid cells. The data sets are separated by single empty lines and terminate with an end of file.

Output

The program prints the solution of the input encoded grids in the same format and order as used for input.

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+剪枝)的更多相关文章

  1. POJ 3009 DFS+剪枝

    POJ3009 DFS+剪枝 原题: Curling 2.0 Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 16280 Acce ...

  2. 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 ...

  3. Sudoku POJ - 3076

    Sudoku Time Limit: 10000MS   Memory Limit: 65536K Total Submissions: 5769   Accepted: 2684 Descripti ...

  4. HDU-6341 Problem J. Let Sudoku Rotate(dfs 剪枝)

    题目:有一个4*4*4*4的数独,每一横每一竖每一个小方块中都无重复的字母,即都为0-9,A-F..有一个已经填好的数独,若干个4*4的方块被逆时针拧转了若干次,问拧转回来至少需要多少次. 分析:很明 ...

  5. DFS(剪枝) POJ 1011 Sticks

    题目传送门 /* 题意:若干小木棍,是由多条相同长度的长木棍分割而成,问最小的原来长木棍的长度: DFS剪枝:剪枝搜索的好题!TLE好几次,终于剪枝完全! 剪枝主要在4和5:4 相同长度的木棍不再搜索 ...

  6. poj 1011 Sticks (DFS+剪枝)

    Sticks Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 127771   Accepted: 29926 Descrip ...

  7. 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 ...

  8. (简单) POJ 3076 Sudoku , DLX+精确覆盖。

    Description A Sudoku grid is a 16x16 grid of cells grouped in sixteen 4x4 squares, where some cells ...

  9. POJ 3076 Sudoku

    3076 思路: dfs + 剪枝 首先,如果这个位置只能填一种字母,那就直接填 其次,如果对于每一种字母,如果某一列或者某一行或者某一块只能填它,那就填它 然后,对于某个位置如果不能填字母了,或者某 ...

随机推荐

  1. Where is NuGet in VS2017 Community?

    问题:在VS2017中找不到NuGet 回答:https://stackoverflow.com/questions/43702484/where-is-nuget-in-vs2017-communi ...

  2. python基础教程(第二版)

    开始学习python,根据Python基础教程,把里面相关的基础章节写成对应的.py文件 下面是github上的链接 python基础第1章基础 python基础第2章序列和元组 python基础第3 ...

  3. python - 发送带各种类型附件的邮件

    如何发送各种类型的附件. 基本思路就是,使用MIMEMultipart来标示这个邮件是多个部分组成的,然后attach各个部分.如果是附件,则add_header加入附件的声明. 在python中,M ...

  4. linux 下安装vscode

    下载安装包 https://code.visualstudio.com/docs/?dv=linux64_deb (注意是deb包) sudo dpkg -i code_1.18.1-15108573 ...

  5. 2。创建第一个angular应用,已经开发前的一些配置

    现在我们开始新建一个angular5的脚手架  . 到想要建项目的目录下.比如我的 在  D:\JsProjects 进入cmd或者powershell cd 进入该文件夹下 然后开始新建,ng ne ...

  6. 网络编程—udp

    一.ip地址 1. 什么是地址 地址就是用来标记地点的 2. ip地址的作用 ip地址:用来在网络中标记一台电脑,比如192.168.1.1:在本地局域网上是唯一的. 3. ip地址的分类 每一个IP ...

  7. tensorflow(2):神经网络优化(loss,learning_rate)

    案例: 预测酸奶的日销量, 由此可以准备产量, 使得损失小(利润大),假设销量是y , 影响销量的有两个因素x1, x2, 需要预先采集数据,每日的x1,x2和销量y_, 拟造数据集X,Y_, 假设y ...

  8. C++ shut down a computer

    前阵子有朋友问我,怎么用C语言写一个小程序,控制电脑关机.这个我真的不懂,这几天闲着,就上网搜了搜,整理一下. IDE: Code::Blocks 16.01 操作系统:Windows 7 x64 # ...

  9. BZoj 2301 Problem b(容斥定理+莫比乌斯反演)

    2301: [HAOI2011]Problem b Time Limit: 50 Sec  Memory Limit: 256 MB Submit: 7732  Solved: 3750 [Submi ...

  10. Asp.Net MVC Ajax轮训解决Session失效时间

    这种方法不是太好,对服务器得压力大,由于系统是内部人员使用,业务有比较复杂,所以有些值得需要Session去保存,但是,Session有失效时间. 代码如下: $(function () { func ...