题意:

给你9*9的矩阵。对于每个数字,能减16代表上面有墙,能减32代表下面有墙。。。

最后剩下的数字是0代表这个位置数要求,不是0代表这个数已知了。

然后通过墙会被数字分成9块。

然后做数独,这里的数独不是分成9个3*3的小块而是通过墙分成的。

思路:

首先通过数字作出墙。

然后bfs求连通块,dfs也可以。目的是分块。

然后就是dlx数独模板题了。

这里要注意的是如果找到答案2次就说明有多组解了,就应该停止返回了。不然会TLE。

代码:

#include"stdio.h"
#include"algorithm"
#include"string.h"
#include"iostream"
#include"cmath"
#include"queue"
#include"map"
#include"vector"
#include"string"
using namespace std;
#define RN 9*9*9+5
#define CN 4*9*9+5
#define N 9*9*9*4+5
int wall[12][12][12][12];
int mp[12][12],used[12][12];
int dis[4][2]= {{0,1},{0,-1},{-1,0},{1,0}};
int kx,ff;
template<class T>inline void getd(T &x)
{int ch = getchar();bool minus = false;while(!isdigit(ch) && ch != '-')ch = getchar();if(ch == '-')minus = true, ch = getchar();x = ch - '0';while(isdigit(ch = getchar()))x = x * 10 - '0' + ch;if(minus)x = -x;
}struct node
{int x,y;
};
void bfs(int x,int y)
{node cur,next;cur.x=x;cur.y=y;queue<node>q;q.push(cur);used[cur.x][cur.y]=kx;while(!q.empty()){cur=q.front();q.pop();for(int i=0; i<4; i++){next.x=cur.x+dis[i][0];next.y=cur.y+dis[i][1];if(used[next.x][next.y]!=0 || wall[cur.x][cur.y][next.x][next.y]==1 ) continue;used[next.x][next.y]=kx;q.push(next);}}kx++;return ;
}struct DLX
{int n,m,C;int U[N],D[N],L[N],R[N],Row[N],Col[N];int H[RN],S[CN],cnt,ans[RN];void init(int _n,int _m){n=_n;m=_m;for(int i=0; i<=m; i++){U[i]=D[i]=i;L[i]=(i==0?m:i-1);R[i]=(i==m?0:i+1);S[i]=0;}C=m;for(int i=1; i<=n; i++) H[i]=-1;}void link(int x,int y){C++;Row[C]=x;Col[C]=y;S[y]++;U[C]=U[y];D[C]=y;D[U[y]]=C;U[y]=C;if(H[x]==-1) H[x]=L[C]=R[C]=C;else{L[C]=L[H[x]];R[C]=H[x];R[L[H[x]]]=C;L[H[x]]=C;}}void del(int x){R[L[x]]=R[x];L[R[x]]=L[x];for(int i=D[x]; i!=x; i=D[i]){for(int j=R[i]; j!=i; j=R[j]){U[D[j]]=U[j];D[U[j]]=D[j];S[Col[j]]--;}}}void rec(int x){for(int i=U[x]; i!=x; i=U[i]){for(int j=L[i]; j!=i; j=L[j]){U[D[j]]=j;D[U[j]]=j;S[Col[j]]++;}}R[L[x]]=x;L[R[x]]=x;}void dance(int x){if(R[0]==0){ff++;if(ff>=2) return ;cnt=x;for(int i=0; i<cnt; i++){int tep=ans[i]-1;int a=tep/81,b=(tep%81)/9;mp[a+1][b+1]=tep%9+1;}return ;}int now=R[0];for(int i=R[0]; i!=0; i=R[i]){if(S[i]<S[now]) now=i;}del(now);for(int i=D[now]; i!=now; i=D[i]){ans[x]=Row[i];for(int j=R[i]; j!=i; j=R[j]) del(Col[j]);dance(x+1);if(ff>=2) return ;for(int j=L[i]; j!=i; j=L[j]) rec(Col[j]);}rec(now);return ;}
} dlx;
void getplace(int i,int j,int k,int &x,int &a,int &b,int &c)
{x=(i-1)*81+(j-1)*9+k;a=81+(i-1)*9+k;b=81*2+(j-1)*9+k;c=81*3+(used[i][j]-1)*9+k;
}
int main()
{int t,cas=1;cin>>t;while(t--){memset(wall,0,sizeof(wall));for(int i=1; i<=9; i++){for(int j=1; j<=9; j++){int x;getd(x);if(x-128>=0){x-=128;wall[i][j][i][j-1]=1;}if(x-64>=0){x-=64;wall[i][j][i+1][j]=1;}if(x-32>=0){x-=32;wall[i][j][i][j+1]=1;}if(x-16>=0){x-=16;wall[i][j][i-1][j]=1;}mp[i][j]=x;}}kx=1;memset(used,0,sizeof(used));for(int i=1; i<=9; i++) for(int j=1; j<=9; j++) if(used[i][j]==0) bfs(i,j);dlx.init(9*9*9,4*9*9);for(int i=1; i<=9; i++){for(int j=1; j<=9; j++){int tep=(i-1)*9+j;int x,a,b,c;if(mp[i][j]==0){for(int k=1; k<=9; k++){getplace(i,j,k,x,a,b,c);dlx.link(x,tep);dlx.link(x,a);dlx.link(x,b);dlx.link(x,c);}}else{getplace(i,j,mp[i][j],x,a,b,c);dlx.link(x,tep);dlx.link(x,a);dlx.link(x,b);dlx.link(x,c);}}}ff=0;dlx.dance(0);printf("Case %d:\n",cas++);if(ff==0) puts("No solution");else if(ff==1){for(int i=1; i<=9; i++) for(int j=1; j<=9; j++) printf(j==9?"%d\n":"%d",mp[i][j]);}else puts("Multiple Solutions");}return 0;
}

[DLX+bfs] hdu 4069 Squiggly Sudoku相关推荐

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

  2. HDU 4069 Squiggly Sudoku 【DLX+BFS】

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

  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

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

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

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

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

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

  8. DLX精确覆盖 hdu4069 Squiggly Sudoku

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

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

最新文章

  1. 您的请求参数与订单信息不一致_长春各学校信息审核结果出炉!这些情况不符合“两个一致”...
  2. Windows XP中安装虚拟网卡microsoft loopback adapter
  3. 让android的TextView可以滚动
  4. 福玛特机器人评测_深度爆料扫地机器人地宝福玛特D820评测好不好?怎么样呢?内幕曝光测评...
  5. OpenGL——使用Bresenham算法绘制圆
  6. 数据库性能瓶颈的出现
  7. juqery-筛选器-找前后上下
  8. 《你好,李焕英》口碑爆棚,原来秘诀都隐藏在了影迷的评论里面
  9. DeepLearning | Tensorflow编程基础:Session、Constant、Variable、Tensor、Placeholder、OP
  10. DateTime相关知识
  11. HDU-4512 吉哥系列故事——完美队形I 最长公共上升子序列
  12. 诺奖得主:2030年中国帕金森疾病患者将超过美国
  13. 韩国职业选手风格分析
  14. 前端(JavaScript)------字符串
  15. 基于LCC谐振补偿网络的无线充电技术的研究
  16. bat 脚本修改IE浏览器代理服务器
  17. python for i in 字符串_python中for in的用法
  18. 新西兰java程序员_在新西兰做程序员是一种什么体验?解析新西兰计算机专业...
  19. 团队作业3需求改进与系统设计
  20. Android多线程和常用异步处理技术

热门文章

  1. 【学习笔记】深蓝学院-三维点云处理
  2. STM32 GPS悬停飞控 (三十五)树莓派 4g视频回传
  3. 52单片机led灯闪烁c语言程序,单片机LED灯闪烁程序
  4. Android 9 自动恢复出厂设置问题(auto-recovery)
  5. 精简版Win10/11系统无法登录Xbox及Minecraft Launcher解决方法,不需要重装系统
  6. nginx启动、停止、重启命令
  7. 微信小程序基础之input输入框控件
  8. 如何包装你的实验结果
  9. Python中的break语句
  10. 最短路(Finding Shortest Path)