//HDOJ 4069 Squiggly Sudoku 精确覆盖+搜索
/*
题意:数独变形 9块弯弯曲曲的区域 每块有9个小格往这81个格子里面填写1-9的数字,使得每行,每列,每个区域都含有1、2、3...9思路:先搜索标记出每一块 再精确覆盖*/
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<queue>
using namespace std;
#define INF 0x7FFFFFFF
#define N 750
#define M 350
#define V N*Mint n, m, size, row, cnt;
int L[V], R[V], U[V], D[V], C[V] , X[V];
int S[M], Q[N] , H[N];
int s[10][10];
bool map[100][100],vis[N];
int dir[][2] = {0,-1,1,0,0,1,-1,0};
int bx[] = {128,64,32,16};
int color[10][10],ans[N];
struct node{int x,y;
};
void init(){int i;for (i = 0; i <= m; i++){S[i] = 0;L[i + 1] = i;R[i] = i + 1;U[i] = D[i] = i;}R[m] = 0;size = m + 1;
}
void remove(int c){int i, j;R[L[c]] = R[c];L[R[c]] = L[c];for (i = D[c]; i != c; i = D[i]){for (j = R[i]; j != i; j = R[j]){D[U[j]] = D[j];U[D[j]] = U[j];S[C[j]]--;}}
}
void resume(int c){int i, j;R[L[c]] = c;L[R[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]]++;}}
}
void Link(int r, int c){D[size] = D[c];U[size] = c;U[D[c]] = size;D[c] = size;if (H[r] < 0)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]++;C[size] = c;X[size++] = r;
}
bool Dance(){int i, j, c, temp;if (R[0] == 0){++cnt;if(cnt == 1){for(i = j = 1; i <= row; ++i)if(vis[i])ans[j++] = Q[i];}return cnt > 1;}for (temp = INF, i = R[0]; i; i = R[i]){if (S[i] < temp){c = i;temp = S[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())return true;for (j = L[i]; j != i; j = L[j])resume(C[j]);vis[X[i]] = false;}resume(c);return false;
}
bool check(int x,int y){if(x>=1 && x<=9 && y>=1 && y<=9)return true;return false;
}
void Init(){int i,j,k,x,y;memset(map,false,sizeof(map));for(i = 1; i <= 9; ++i){for(j = 1; j <= 9; ++j){       scanf("%d",&s[i][j]);for(k = 0; k < 4; ++k){if(s[i][j] >= bx[k])s[i][j] -= bx[k];else{x = i + dir[k][0];y = j + dir[k][1];if(check(x,y))map[(i-1)*9+j][(x-1)*9+y] = true;}}}}
}
void bfs(int x,int y,int c){int k;queue<node>Q;node p,q;p.x = x;p.y = y;Q.push(p);while(!Q.empty()){q = Q.front();Q.pop();for(k = 0; k < 4; ++k){p.x = q.x + dir[k][0];p.y = q.y + dir[k][1];if(check(p.x,p.y) && map[(q.x-1)*9+q.y][(p.x-1)*9+p.y] && color[p.x][p.y]==-1){color[p.x][p.y] = c;Q.push(p);}}}
}
void Color(){int i,j,num = 0;memset(color,-1,sizeof(color));for(i = 1; i <= 9; ++i)for(j = 1; j <= 9; ++j){if(color[i][j] == -1){color[i][j] = num;bfs(i,j,num);num++;}}
}
void Build(){init();int i,j,k;row = 0;for(i = 1; i <= 9; ++i){for(j = 1; j <= 9; ++j){if(s[i][j] == 0){for(k = 1; k <= 9; ++k){H[++row] = -1;Q[row] = k;Link(row,(i-1)*9+k);Link(row,81+(j-1)*9+k);Link(row,162+color[i][j]*9+k);Link(row,243+(i-1)*9+j);}}else{H[++row] = -1;k = s[i][j];Q[row] = k;Link(row,(i-1)*9+k);Link(row,81+(j-1)*9+k);Link(row,162+color[i][j]*9+k);Link(row,243+(i-1)*9+j);}}}}
int main(){int T,i,j,num,ca = 1;int x,y;m = 324;scanf("%d",&T);while(T--){Init();Color();Build();memset(vis,false,sizeof(vis));cnt = 0;Dance();printf("Case %d:\n",ca++);if(cnt == 0)puts("No solution");else if(cnt > 1)puts("Multiple Solutions");else{num = 1;for(i = 1; i <= 9; ++i){for(j = 1; j <= 9; ++j){printf("%d",ans[num]);if(num%9 == 0)puts("");num++;}}}}return 0;
}

HDOJ 4069 Squiggly Sudoku 精确覆盖+搜索相关推荐

  1. HDU 4069 Squiggly Sudoku【Dancing Links精确覆盖】

    跟普通的数独有一点点不同,先预处理一下再用Dancing Links进行精确覆盖即可. #include <iostream> #include <cstdio> #inclu ...

  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 Dancing-Links(DLX)+Floodfill

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

  5. HDU 4069 Squiggly Sudoku 【DLX+BFS】

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

  6. HDU 4069 Squiggly Sudoku DLX

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

  7. [DLX+bfs] hdu 4069 Squiggly Sudoku

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

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

  9. DLX精确覆盖 hdu4069 Squiggly Sudoku

    传送门:点击打开链接 题意:将9*9的棋盘分割成了9个部分,每个部分都是9个格子,然后现在要求每个部分的数字恰是1~9的排列,每一行每一列恰是1~9的排列,问是否有解,有多少组解,如果只有1组解打印出 ...

最新文章

  1. 阿里员工哀叹不读书已经没有出路,招聘简历基本都是985
  2. OpenGL交互——菜单控制(基础教程)
  3. Py之pandas:pandas的read_excel()函数中各参数说明及函数使用方法讲解
  4. 通过组策略禁止用户安装任何软件
  5. 【公开课预告】:白板与开源
  6. Visual C++ 2008 runtime files are out of data
  7. Spring Aop——给Advice传递参数
  8. Frida Android hook
  9. SQLAlchemy 教程 —— ORM 方式使用示例
  10. es6 Symbol.for(),Symbol.keyFor()
  11. 试一下live writer 插入代码是否会高亮
  12. Asp.net页面之间传“大量的参数”
  13. 应用多元统计分析第四章基于最小二乘估计线性回归分析python代码
  14. JQuery UI 各框架总结
  15. qt 获取屏幕分辨率
  16. Ubuntu18.04平台下用GitHub搭建个人博客(含域名绑定和更换主题)
  17. github开源企业级应用框架介绍CIIP
  18. sleep的睡眠机制
  19. UBUNTU ROS 编译后无法rosrun package文件(已解决)
  20. 阿里云NLP接口调用

热门文章

  1. idea 2018版的无法在线下载安装插件解决方法
  2. 似然函数以及最大似然估计
  3. 面向对象与面向过程理解
  4. bzoj3694:最短路(最短路树+并查集)
  5. [智能硬件]是什么?智能硬件应用领域包括哪些?
  6. Spring Boot技术栈博客企业前后端
  7. 人力资源战略规划新思考
  8. 腾讯人力资源管理体系
  9. Xilinx公司的Vivado 2022.2版本在Windows和Linux系统上的下载配置教程
  10. vue中弹幕实现及优化