HDU 4069 Squiggly Sudoku Dancing-Links(DLX)+Floodfill
题目大意:。。还是数独,不同的是原先的九宫格约束条件变为了给定的任意形状。。。
我们跑一遍floodfill 得出每一个格子属于哪一个形状
然后就是裸的数独了
这题T<=2500 绝对不能开动态 清则TLE 不清MLE 只能数组模拟
好不容易改完了 尼玛 交上去就WA
最后发现当找到一组解之后 一定要把当前的数独转移到ANS数组中 否则就会被覆盖 导致输出时错误
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
struct abcd{int l,r,u,d;int x,y,num;int bottom;void del();void restore();
}table[4000];
int head,tot,stack[4000],top;
int m,n,cnt,flag,map[9][9],belong[9][9],input[9][9],ans[9][9];
void del_column(int pos)
{int i,j;for(i=table[pos].u;i;i=table[i].u){for(j=table[i].l;j;j=table[j].l)table[j].del();for(j=table[i].r;j;j=table[j].r)table[j].del();table[i].del();}table[pos].del();
}
inline void output()
{int i,j;for(i=0;i<9;i++){for(j=0;j<9;j++)putchar(ans[i][j]+'0');putchar('\n');}
}
void DLX()
{if(!table[head].r){memcpy(ans,map,sizeof ans);flag++;return ;}int i,mini,bottom=top,minnum=0x7fffffff;for(i=table[head].r;i;i=table[i].r)if(table[i].x<minnum)minnum=table[i].x,mini=i;for(i=table[mini].u;i;i=table[i].u){int x=table[i].x,y=table[i].y,num=table[i].num;map[x][y]=num;del_column(x*9+y+2 );del_column(81+x*9+num+1 );del_column(162+y*9+num+1 );del_column(243+(belong[x][y])*9+num+1 );DLX();while(top!=bottom)table[stack[top--]].restore();if(flag>=2)return ;}
}
int New(int L,int R,int U,int D,int X,int Y,int Num)
{++tot;table[tot].l=L;if(L)table[L].r=tot;table[tot].r=R;if(R)table[R].l=tot;table[tot].u=U;if(U)table[U].d=tot;table[tot].d=D;if(D)table[D].u=tot;table[tot].x=X;table[tot].y=Y;table[tot].num=Num;table[tot].bottom=D;if(table[tot].bottom)table[table[tot].bottom].x++;return tot;
}
void abcd :: del()
{if(l)table[l].r=r;if(r)table[r].l=l;if(u)table[u].d=d;if(d)table[d].u=u;if(bottom)table[bottom].x--;stack[++top]=this-table;
}
void abcd :: restore()
{if(l)table[l].r=this-table;if(r)table[r].l=this-table;if(u)table[u].d=this-table;if(d)table[d].u=this-table;if(bottom)table[bottom].x++;
}
void add(int x,int y,int num)
{int last=0,temp;temp=x*9+y+2 ,last=New(last,0,table[temp].u,temp,x,y,num);temp=81+x*9+num+1 ,last=New(last,0,table[temp].u,temp,x,y,num);temp=162+y*9+num+1 ,last=New(last,0,table[temp].u,temp,x,y,num);temp=243+(belong[x][y])*9+num+1,last=New(last,0,table[temp].u,temp,x,y,num);
}
void initialize()
{int i;top=0;flag=0;cnt=0;tot=0;head=New(0,0,0,0,0,0,0);memset(map,-1,sizeof map);for(i=1;i<=81*4;i++)New(i,0,0,0,0,0,0);
}
void floodfill(int x,int y)
{if(~map[x][y])return ;belong[x][y]=cnt;map[x][y]=input[x][y]&15;if(~input[x][y]&16 )floodfill(x-1,y);if(~input[x][y]&32 )floodfill(x,y+1);if(~input[x][y]&64 )floodfill(x+1,y);if(~input[x][y]&128)floodfill(x,y-1);
}
int main()
{int T,i,j,k,x,Case=0;//freopen("sudoku.in","r",stdin);//freopen("sudoku.out","w",stdout);for(cin>>T;T;T--){initialize();printf("Case %d:\n",++Case);for(i=0;i<9;i++)for(j=0;j<9;j++)scanf("%d",&input[i][j]);for(i=0;i<9;i++)for(j=0;j<9;j++)if(map[i][j]==-1)floodfill(i,j),cnt++;for(i=0;i<9;i++)for(j=0;j<9;j++)if(map[i][j])add(i,j,map[i][j]);elsefor(k=1;k<=9;k++)add(i,j,k);DLX();if(!flag)puts("No solution");else if(flag==1)output();elseputs("Multiple Solutions");}
}
HDU 4069 Squiggly Sudoku Dancing-Links(DLX)+Floodfill相关推荐
- 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+BFS】
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4069 ★这题一开始题都看不懂,后来发现还是挺有意思的 题意: 给你一个9x9的矩阵, 矩阵里面有一些墙 ...
- HDU 4069 Squiggly Sudoku DLX 精确覆盖
题意: 数独问题,给你9个连通块,每个连通块有9个位置. 现在已经有一些数字在上面,让你在空的位置上放数字. 问你是否存在方案,使得每个连通块包含1~9,并且每行每列都有1~9的数字. 输出结果参照样 ...
- 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 DLX
Dancing Links DLX Dancing Links 用来解精准覆盖问题. 精准覆盖问题有两种版本. 精准覆盖 : 给一个01矩阵,如何选出若干行,使得每列都有且仅有一个1. 可以求最少行数 ...
- 【算法】Dancing Links (DLX) I
From: http://blog.csdn.net/keyboardlabourer/article/details/13015689 1.概述 Dacing Links (DLX) 算法是Dona ...
最新文章
- Flex Javascript 交互实现代码
- [转]Linux文件搜索
- 阿里云服务器ubuntu14.04安装Redis
- char和vchar
- Android中的自定义view和自定义属性TypedArray的使用
- 5G NR Paging寻呼
- 如果你的sharepoint 2013很慢...
- JDK1.8 win10系统 环境变量配置
- ActiveMQ 依赖JDK版本
- php 量 高并发 nosql,nosql - 高并发下Apache+mongodb的php驱动不稳定
- node使用ffmpeg拼接音频
- java查询mongodb数据_从mongodb中查询数据
- 2010年国家公务员考试行测真题WORD完整版
- 计算机专业买笔记本电脑游戏本还是商务本好,购买笔记本电脑,游戏本真的是第一选择吗?...
- 为什么我的微信小程序开发工具调试窗口一片空白?
- 坑爹大冒险html5游戏在线玩,《史上最坑爹的大冒险》 图文全通关攻略
- mysql grant produce_ERROR 1045 (28000) Mysql中grant 使用不当导致的生产事故
- 汉诺塔III 汉诺塔IV 汉诺塔V
- 《淘宝网开店 拍摄 修图 设计 装修 实战150招》一一2.9 疏密相间构图法
- FAQ 检索式问答系统学习记录
热门文章
- 有意思的张飞日记-_-
- linux 怎么撤销移动命令,Linux的常用命令
- UML建模与软件开发设计(六)——类图设计与类之间的关系
- userdel: user * is currently used by process 1278
- 仿射密码加密解密(C语言)
- 那些让你“相见恨晚”的数据分析软件,一般人我不告诉他
- 安卓手机查看充放电电压、电流及功率
- 直流马达驱动_ADC_PWM加减速(STM32F4 CubeMX)
- CMD下添加IP地址,删除IP地址
- matlab函数之reshape()