HDOJ 4069 Squiggly Sudoku 精确覆盖+搜索
//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 精确覆盖+搜索相关推荐
- HDU 4069 Squiggly Sudoku【Dancing Links精确覆盖】
跟普通的数独有一点点不同,先预处理一下再用Dancing Links进行精确覆盖即可. #include <iostream> #include <cstdio> #inclu ...
- 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 Dancing-Links(DLX)+Floodfill
题目大意:..还是数独,不同的是原先的九宫格约束条件变为了给定的任意形状... 我们跑一遍floodfill 得出每一个格子属于哪一个形状 然后就是裸的数独了 这题T<=2500 绝对不能开动态 ...
- HDU 4069 Squiggly Sudoku 【DLX+BFS】
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4069 ★这题一开始题都看不懂,后来发现还是挺有意思的 题意: 给你一个9x9的矩阵, 矩阵里面有一些墙 ...
- HDU 4069 Squiggly Sudoku DLX
这是昨天周赛的题,我竟然不会怎么判断多解,后来一google,卧槽,我想复杂了......直接看能搜出来几次就行了. 这题就是个变形,先floodfill一下,然后就是模板了 然后发现比大华的快了好几 ...
- [DLX+bfs] hdu 4069 Squiggly Sudoku
题意: 给你9*9的矩阵.对于每个数字,能减16代表上面有墙,能减32代表下面有墙... 最后剩下的数字是0代表这个位置数要求,不是0代表这个数已知了. 然后通过墙会被数字分成9块. 然后做数独,这里 ...
- [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 ...
- DLX精确覆盖 hdu4069 Squiggly Sudoku
传送门:点击打开链接 题意:将9*9的棋盘分割成了9个部分,每个部分都是9个格子,然后现在要求每个部分的数字恰是1~9的排列,每一行每一列恰是1~9的排列,问是否有解,有多少组解,如果只有1组解打印出 ...
最新文章
- 阿里员工哀叹不读书已经没有出路,招聘简历基本都是985
- OpenGL交互——菜单控制(基础教程)
- Py之pandas:pandas的read_excel()函数中各参数说明及函数使用方法讲解
- 通过组策略禁止用户安装任何软件
- 【公开课预告】:白板与开源
- Visual C++ 2008 runtime files are out of data
- Spring Aop——给Advice传递参数
- Frida Android hook
- SQLAlchemy 教程 —— ORM 方式使用示例
- es6 Symbol.for(),Symbol.keyFor()
- 试一下live writer 插入代码是否会高亮
- Asp.net页面之间传“大量的参数”
- 应用多元统计分析第四章基于最小二乘估计线性回归分析python代码
- JQuery UI 各框架总结
- qt 获取屏幕分辨率
- Ubuntu18.04平台下用GitHub搭建个人博客(含域名绑定和更换主题)
- github开源企业级应用框架介绍CIIP
- sleep的睡眠机制
- UBUNTU ROS 编译后无法rosrun package文件(已解决)
- 阿里云NLP接口调用