POJ 3074 Sudoku (Dacing Links)
推荐一个写数独很好的博客:http://www.cnblogs.com/grenet/p/3163550.html
主要是把九宫格里的元素换到矩阵里面再求解dancing links
网上找的一模版
#include<cstdio>
#include<cstring>
#define MAXM 10
#define MAXL 324
#define MAXN 240000
#define INF 0x7FFFFFFF
char sd[MAXM][MAXM];
int L[MAXN], R[MAXN], U[MAXN], D[MAXN], H[MAXN];
int size, C[MAXN], S[MAXN], X[MAXN], Q[MAXN], vis[MAXL * ];
bool Read()
{
int i, j;
for (i = ; i < MAXM; i++)
{
for (j = ; j < MAXM; j++)
{
scanf(" %c", &sd[i][j]);
if (sd[i][j] == 'e')
return false;
}
}
return true;
}
void Init()
{
int i;
for (i = ; i <= MAXL; i++)
{
L[i + ] = i;
R[i] = i + ;
U[i] = D[i] = i;
S[i] = ;
}
R[MAXL] = ;
size = MAXL + ;
}
void Remove(int c)
{
int i, j;
L[R[c]] = L[c];
R[L[c]] = R[c];
for (i = D[c]; i != c; i = D[i])
{
for (j = R[i]; j != i; j = R[j])
{
U[D[j]] = U[j];
D[U[j]] = D[j];
S[C[j]]--;
}
}
}
void Resume(int c)
{
int i, j;
L[R[c]] = c;
R[L[c]] = c;
for (i = D[c]; i != c; i = D[i])
{
for (j = R[i]; j != i; j = R[j])
{
U[D[j]] = j;
D[U[j]] = j;
S[C[j]]++;
}
}
}
inline void Link(int r, int c)
{
D[size] = D[c];
U[size] = c;
U[D[c]] = size;
D[c] = size;
if (H[r] < )
H[r] = L[size] = R[size] = size;
else
{
L[size] = H[r];
R[size] = R[H[r]];
L[R[H[r]]] = size;
R[H[r]] = size;
}
S[c]++;
X[size] = r;
C[size++] = c;
}
bool Dance(int now)
{
int i, j, c, temp;
if (R[] == )
return true;
for (temp = INF,i = R[]; i; i = R[i])
{
if (S[i] < temp)
{
temp = S[i];
c = i;
}
}
Remove(c);
for (i = D[c]; i != c; i = D[i])
{
vis[X[i]] = true;
for (j = R[i]; j != i; j = R[j])
Remove(C[j]);
if (Dance(now + ))
return true;
for (j = L[i]; j != i; j = L[j])
Resume(C[j]);
vis[X[i]] = false;
}
Resume(c);
return false;
}
int main()
{
int i, j, k, r;
while (Read())
{
Init();
for (r = , i = ; i < MAXM; i++)
{
for (j = ; j < MAXM; j++)
{
if (sd[i][j] == '.')
{
for (k = ; k < MAXM; k++)
{
H[++r] = -;
Q[r] = k;
Link(r, (i - ) * + k);
Link(r, + (j - ) * + k);
Link(r, + ((i - ) / * + (j - ) / ) * + k);
Link(r, + (i - ) * + j);
}
}
else
{
H[++r] = -;
k = sd[i][j] - '';
Q[r] = k;
Link(r, (i - ) * + k);
Link(r, + (j - ) * + k);
Link(r, + ((i - ) / * + (j - ) / ) * + k);
Link(r, + (i - ) * + j);
}
}
}
memset(vis, false, sizeof(vis));
Dance();
for (i = ; i <= r; i++)
{
if (vis[i])
printf("%d", Q[i]);
}
putchar('\n');
}
return ;
}
POJ 3074 Sudoku (Dacing Links)的更多相关文章
- poj 3074 Sudoku(Dancing Links)
Sudoku Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 8152 Accepted: 2862 Descriptio ...
- POJ 3074 Sudoku (DLX)
Sudoku Time Limit:1000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u Submit Statu ...
- POJ 3074 Sudoku (Dancing Links)
传送门:http://poj.org/problem?id=3074 DLX 数独的9*9的模板题. 具体建模详见下面这篇论文.其中9*9的数独怎么转化到精确覆盖问题,以及相关矩阵行列的定义都在下文中 ...
- POJ 3074 Sudoku DLX精确覆盖
DLX精确覆盖.....模版题 Sudoku Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 8336 Accepted: ...
- POJ 3076 Sudoku (dancing links)
题目大意: 16*16的数独. 思路分析: 多说无益. 想说的就是dancing links 的行是依照 第一行第一列填 1 第一行第二列填 2 -- 第一行第十五列填15 第一行第二列填 1 -- ...
- (简单) POJ 3074 Sudoku, DLX+精确覆盖。
Description In the game of Sudoku, you are given a large 9 × 9 grid divided into smaller 3 × 3 subgr ...
- POJ - 3074 Sudoku (搜索)剪枝+位运算优化
In the game of Sudoku, you are given a large 9 × 9 grid divided into smaller 3 × 3 subgrids. For exa ...
- POJ 3074 Sudoku(算竞进阶习题)
二进制优化+dfs 话说这题数据中真的丧心病狂..不加inline还过不去.. 因为不会DLX只好用二进制来优化了...万万没想到还是低空飘过 我们在行.列.格分别用一个9位二进制常数来记录什么数能放 ...
- 搜索(DLX): POJ 3074 3076 Sudoku
POJ 3074 : Description In the game of Sudoku, you are given a large 9 × 9 grid divided into smaller ...
随机推荐
- (poj)3414 Pots (输出路径的广搜)
Description You are given two pots, having the volume of A and B liters respectively. The following ...
- 九度OJ 1361 翻转单词顺序
题目地址:http://ac.jobdu.com/problem.php?pid=1361 题目描述: JOBDU最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上.同事Ca ...
- maya2105 - windows8 - numpy/scipy
To compile numpy, create a site.cfg file in numpy's source directory with the following or similar c ...
- hdu10007
题意,很简单,给n个点的坐标,求距离最近的一对点之间距离的一半. 第一行是一个数n表示有n个点,接下来n行是n个点的x坐标和y坐标.实数. 这个题目其实就是求最近点对的距离 #include< ...
- POJ 3267 The Cow Lexicon 简单DP
题目链接: http://poj.org/problem?id=3267 从后往前遍历,dp[i]表示第i个字符到最后一个字符删除的字符个数. 状态转移方程为: dp[i] = dp[i+1] + 1 ...
- PADS故障解决
1. 点击PADS后就会出现以下: "The directory pointed by the FileDir INI file entry cannot be found.Aborting ...
- E.164 Format
From http://en.wikipedia.org/wiki/E.164 E.164 is an ITU-T recommendation, titled The international p ...
- PHP 文件上传注意一个地方,移动文件时要保证目标目录存在,否则报错
move_uploaded_file ( $_FILES ["file"] ["tmp_name"], "upload/" . $fileN ...
- 自定义滚轮效果选择器spinnerwheel的使用总结
项目中有使用到像IOS滚轮效果的选择时间或数字的组件:android-spinnerwheel github地址:https://github.com/ai212983/android-spinner ...
- ListView getView中放置多个item和getItemViewType的用法
ListView 和 Adapter 的基础 工作原理: ListView 针对List中每个item,要求 adapter “给我一个视图” (getView). 一个新的视图被返回并显示 如果我们 ...