HDU 4069 Squiggly Sudoku【Dancing Links精确覆盖】
跟普通的数独有一点点不同,先预处理一下再用Dancing Links进行精确覆盖即可。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>using namespace std;const int maxn = 9*9*9*9*9*4 + 10;
const int oo = 1 << 30;
const int maxrow = 9*9*9 + 10;
const int maxcol = 9*9*4 + 10;
int mtx[maxrow][maxcol];
int sub[10][10];
int map[10][10];
int ansMap[10][10];int totRow, totCol, head, idx;
int L[maxn], R[maxn], U[maxn], D[maxn];
int RH[maxn], CH[maxn], S[maxn];
int t, ans;void initMtx()
{memset(mtx, 0, sizeof(mtx));for (int i = 0; i < 9; ++i) {for (int j = 0; j < 9; ++j) {int t = i * 9 + j;if (map[i][j] == 0) {for (int k = 0; k < 9; ++k) {int row = t * 9 + k;mtx[row][t] = 1;mtx[row][i*9+k+81] = 1;mtx[row][j*9+k+162] = 1;mtx[row][sub[i][j]*9+k+243] = 1;}} else {int k = map[i][j] - 1;int row = t * 9 + k;mtx[row][t] = 1;mtx[row][i*9+k+81] = 1;mtx[row][j*9+k+162] = 1;mtx[row][sub[i][j]*9+k+243] = 1;}}}
}int newNode(int up, int down, int left, int right)
{U[idx] = up; D[idx] = down;L[idx] = left; R[idx] = right;U[down] = D[up] = L[right] = R[left] = idx;return idx++;
}void build()
{idx = maxn - 1;head = newNode(idx, idx, idx, idx);idx = 0;for (int j = 0; j < totCol; ++j) {newNode(idx, idx, L[head], head);CH[j] = j; S[j] = 0;}for (int i = 0; i < totRow; ++i) {int k = -1;for (int j = 0; j < totCol; ++j) {if (!mtx[i][j]) continue;if (-1 == k) {k = newNode(U[CH[j]], CH[j], idx, idx);RH[k] = i; CH[k] = j; S[j]++;} else {k = newNode(U[CH[j]], CH[j], k, R[k]);RH[k] = i; CH[k] = j; S[j]++;}}}
}inline void remove(int c)
{L[R[c]] = L[c];R[L[c]] = R[c];for (int i = D[c]; i != c; i = D[i]) {for (int j = R[i]; j != i; j = R[j]) {U[D[j]] = U[j]; D[U[j]] = D[j]; S[CH[j]]--;}}
}inline void resume(int c)
{L[R[c]] = c;R[L[c]] = c;for (int i = U[c]; i != c; i = U[i]) {for (int j = L[i]; j != i; j = L[j]) {U[D[j]] = j; D[U[j]] = j; S[CH[j]]++;}}
}int dance()
{if (R[head] == head) {if (ans == 0) {for (int i = 0; i < 9; ++i) {for (int j = 0; j < 9; ++j) {ansMap[i][j] = map[i][j];}} }return ++ans;}int i, j, k, c, min = oo;for (j = R[head]; j != head; j = R[j]) {if (S[j] < min) {min = S[j]; c = j;}}remove(c);for (i = D[c]; i != c; i = D[i]) {k = RH[i];map[k/9/9][(k/9)%9] = (k % 9) + 1;for (j = R[i]; j != i; j = R[j]) {remove(CH[j]);}if (dance() >= 2) {return 2;}for (j = L[i]; j != i; j = L[j]) {resume(CH[j]);}map[k/9/9][(k/9)%9] = 0;}resume(c);return 0;
}inline bool hasWall(int x, int y, int d)
{int tmp = map[x][y] / 16;return tmp & (1 << d);
}void dfs(int x, int y, int id)
{if (sub[x][y] != -1) {return ;}sub[x][y] = id;if (!hasWall(x, y, 0)) {dfs(x - 1, y, id);}if (!hasWall(x, y, 1)) {dfs(x, y + 1, id); }if (!hasWall(x, y, 2)) {dfs(x + 1, y, id);}if (!hasWall(x, y, 3)) {dfs(x, y - 1, id);}
}int main()
{totRow = 9*9*9, totCol = 9*9*4;scanf("%d", &t);for (int cas = 1; cas <= t; ++cas) {for (int i = 0; i < 9; ++i) {for (int j = 0; j < 9; ++j) {scanf("%d", &map[i][j]);} }memset(sub, -1, sizeof(sub));int id = 0;for (int i = 0; i < 9; ++i) {for (int j = 0; j < 9; ++j) {if (sub[i][j] == -1) {dfs(i, j, id);id++;}}}for (int i = 0; i < 9; ++i) {for (int j = 0; j < 9; ++j) {map[i][j] %= 16;}}initMtx();build();ans = 0;dance();printf("Case %d:\n", cas);if (ans == 0) {printf("No solution\n");} else if (ans > 1) {printf("Multiple Solutions\n");} else {for (int i = 0; i < 9; ++i) {for (int j = 0; j < 9; ++j) {printf("%d", ansMap[i][j]);}printf("\n");} }}return 0;
}
HDU 4069 Squiggly Sudoku【Dancing Links精确覆盖】相关推荐
- [kuangbin]专题三 Dancing Links Squiggly Sudoku HDU - 4069【DFS】【精确覆盖】
[题目描述] Today we play a squiggly sudoku, The objective is to fill a 9*9 grid with digits so that each ...
- HDU 4069 Squiggly Sudoku(DLX)(The 36th ACM/ICPC Asia Regional Fuzhou Site —— Online Contest)...
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4069 Problem Description Today we play a squiggly sud ...
- HDU 4069 Squiggly Sudoku DLX 精确覆盖
题意: 数独问题,给你9个连通块,每个连通块有9个位置. 现在已经有一些数字在上面,让你在空的位置上放数字. 问你是否存在方案,使得每个连通块包含1~9,并且每行每列都有1~9的数字. 输出结果参照样 ...
- HDU 4069 Squiggly Sudoku 【DLX+BFS】
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4069 ★这题一开始题都看不懂,后来发现还是挺有意思的 题意: 给你一个9x9的矩阵, 矩阵里面有一些墙 ...
- HDU 4069 Squiggly Sudoku Dancing-Links(DLX)+Floodfill
题目大意:..还是数独,不同的是原先的九宫格约束条件变为了给定的任意形状... 我们跑一遍floodfill 得出每一个格子属于哪一个形状 然后就是裸的数独了 这题T<=2500 绝对不能开动态 ...
- HDU 4069 Squiggly Sudoku DLX
这是昨天周赛的题,我竟然不会怎么判断多解,后来一google,卧槽,我想复杂了......直接看能搜出来几次就行了. 这题就是个变形,先floodfill一下,然后就是模板了 然后发现比大华的快了好几 ...
- [DLX+bfs] hdu 4069 Squiggly Sudoku
题意: 给你9*9的矩阵.对于每个数字,能减16代表上面有墙,能减32代表下面有墙... 最后剩下的数字是0代表这个位置数要求,不是0代表这个数已知了. 然后通过墙会被数字分成9块. 然后做数独,这里 ...
- HDOJ 4069 Squiggly Sudoku 精确覆盖+搜索
//HDOJ 4069 Squiggly Sudoku 精确覆盖+搜索 /* 题意:数独变形 9块弯弯曲曲的区域 每块有9个小格往这81个格子里面填写1-9的数字,使得每行,每列,每个区域都含有1.2 ...
- 简单易懂的Dancing links讲解(4)
DancingLinks的应用 把dancingLink应用于实际问题时,只有一个难点,就是如何把具体的问题转换为可以精确覆盖的01矩阵模型,一旦完成了这个步后,直接套用模板就可以解决问题了. 应用之 ...
最新文章
- 关押罪犯洛谷P1525
- ORG.SPRINGFRAMEWORK.HTTP.CONVERTER.HTTPMESSAGENOTREADABLEEXCEPTION: COULD NOT READ JSON: UNRECOGNIZE
- 第三次学JAVA再学不好就吃翔(part54)--StringBuffer类的添加功能
- HDU 3966 Aragorn's Story (树链剖分+线段树)
- 十步完成windows服务的安装
- 经典排序算法(二十二)--图书馆排序(Library Sort)
- Iar工程调试使用教程
- 软考中级【数据库系统工程师】第0章:如何自学备考,考试介绍考什么,备考教材,上午和下午的体型分数分布,备考课程链接,个人备考感谢
- python画猫咪老师_夏目友人帐 | 绘画小白怎样用水彩画一只圆滚滚的猫咪老师?...
- ruby语言学习-开启篇
- Typescript1-基本语法
- html页面导出word文档
- python实现pdf合并
- python人工智能面试题爱奇艺面试题_【爱奇艺Python面试】爱奇艺大数据面试 python-看准网...
- DVWA sql注入(high)
- Deep Learning Based Registration文章阅读(五)《Anatomy-guided Multimodal Registration by Learning Segment 》
- Linux内核设计与实现 第19章 可移植性
- Linux下 单网卡配置多个ip方法
- (转)MTK之Flash篇一
- C++算法——DFS(图解)