跟普通的数独有一点点不同,先预处理一下再用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精确覆盖】相关推荐

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

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

  3. HDU 4069 Squiggly Sudoku DLX 精确覆盖

    题意: 数独问题,给你9个连通块,每个连通块有9个位置. 现在已经有一些数字在上面,让你在空的位置上放数字. 问你是否存在方案,使得每个连通块包含1~9,并且每行每列都有1~9的数字. 输出结果参照样 ...

  4. HDU 4069 Squiggly Sudoku 【DLX+BFS】

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4069 ★这题一开始题都看不懂,后来发现还是挺有意思的 题意: 给你一个9x9的矩阵, 矩阵里面有一些墙 ...

  5. HDU 4069 Squiggly Sudoku Dancing-Links(DLX)+Floodfill

    题目大意:..还是数独,不同的是原先的九宫格约束条件变为了给定的任意形状... 我们跑一遍floodfill 得出每一个格子属于哪一个形状 然后就是裸的数独了 这题T<=2500 绝对不能开动态 ...

  6. HDU 4069 Squiggly Sudoku DLX

    这是昨天周赛的题,我竟然不会怎么判断多解,后来一google,卧槽,我想复杂了......直接看能搜出来几次就行了. 这题就是个变形,先floodfill一下,然后就是模板了 然后发现比大华的快了好几 ...

  7. [DLX+bfs] hdu 4069 Squiggly Sudoku

    题意: 给你9*9的矩阵.对于每个数字,能减16代表上面有墙,能减32代表下面有墙... 最后剩下的数字是0代表这个位置数要求,不是0代表这个数已知了. 然后通过墙会被数字分成9块. 然后做数独,这里 ...

  8. HDOJ 4069 Squiggly Sudoku 精确覆盖+搜索

    //HDOJ 4069 Squiggly Sudoku 精确覆盖+搜索 /* 题意:数独变形 9块弯弯曲曲的区域 每块有9个小格往这81个格子里面填写1-9的数字,使得每行,每列,每个区域都含有1.2 ...

  9. 简单易懂的Dancing links讲解(4)

    DancingLinks的应用 把dancingLink应用于实际问题时,只有一个难点,就是如何把具体的问题转换为可以精确覆盖的01矩阵模型,一旦完成了这个步后,直接套用模板就可以解决问题了. 应用之 ...

最新文章

  1. 关押罪犯洛谷P1525
  2. ORG.SPRINGFRAMEWORK.HTTP.CONVERTER.HTTPMESSAGENOTREADABLEEXCEPTION: COULD NOT READ JSON: UNRECOGNIZE
  3. 第三次学JAVA再学不好就吃翔(part54)--StringBuffer类的添加功能
  4. HDU 3966 Aragorn's Story (树链剖分+线段树)
  5. 十步完成windows服务的安装
  6. 经典排序算法(二十二)--图书馆排序(Library Sort)
  7. Iar工程调试使用教程
  8. 软考中级【数据库系统工程师】第0章:如何自学备考,考试介绍考什么,备考教材,上午和下午的体型分数分布,备考课程链接,个人备考感谢
  9. python画猫咪老师_夏目友人帐 | 绘画小白怎样用水彩画一只圆滚滚的猫咪老师?...
  10. ruby语言学习-开启篇
  11. Typescript1-基本语法
  12. html页面导出word文档
  13. python实现pdf合并
  14. python人工智能面试题爱奇艺面试题_【爱奇艺Python面试】爱奇艺大数据面试 python-看准网...
  15. DVWA sql注入(high)
  16. Deep Learning Based Registration文章阅读(五)《Anatomy-guided Multimodal Registration by Learning Segment 》
  17. Linux内核设计与实现 第19章 可移植性
  18. Linux下 单网卡配置多个ip方法
  19. (转)MTK之Flash篇一
  20. C++算法——DFS(图解)

热门文章

  1. 使用python获取中国证券投资基金业协会上数据
  2. 字符串到字节数组和字节数组到字符串的转换(编码和解码问题)
  3. 人脸检测or五官检测
  4. ios从打包到上架全过程
  5. openwrt 透明代理上网
  6. Mobile按键对照表
  7. 勇者斗恶龙服务器没有响应,PC版勇者斗恶龙英雄打不开怎么办?
  8. Linux的常用命令有哪些?
  9. Excle数据透视表学习大纲
  10. 思科认证介绍(各种证书)