题目大意:。。还是数独,不同的是原先的九宫格约束条件变为了给定的任意形状。。。

我们跑一遍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相关推荐

  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+BFS】

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

  4. HDU 4069 Squiggly Sudoku DLX 精确覆盖

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

  5. HDU 4069 Squiggly Sudoku DLX

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

  6. [DLX+bfs] hdu 4069 Squiggly Sudoku

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

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

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

  8. Dancing Links DLX

    Dancing Links DLX Dancing Links 用来解精准覆盖问题. 精准覆盖问题有两种版本. 精准覆盖 : 给一个01矩阵,如何选出若干行,使得每列都有且仅有一个1. 可以求最少行数 ...

  9. 【算法】Dancing Links (DLX) I

    From: http://blog.csdn.net/keyboardlabourer/article/details/13015689 1.概述 Dacing Links (DLX) 算法是Dona ...

最新文章

  1. Flex Javascript 交互实现代码
  2. [转]Linux文件搜索
  3. 阿里云服务器ubuntu14.04安装Redis
  4. char和vchar
  5. Android中的自定义view和自定义属性TypedArray的使用
  6. 5G NR Paging寻呼
  7. 如果你的sharepoint 2013很慢...
  8. JDK1.8 win10系统 环境变量配置
  9. ActiveMQ 依赖JDK版本
  10. php 量 高并发 nosql,nosql - 高并发下Apache+mongodb的php驱动不稳定
  11. node使用ffmpeg拼接音频
  12. java查询mongodb数据_从mongodb中查询数据
  13. 2010年国家公务员考试行测真题WORD完整版
  14. 计算机专业买笔记本电脑游戏本还是商务本好,购买笔记本电脑,游戏本真的是第一选择吗?...
  15. 为什么我的微信小程序开发工具调试窗口一片空白?
  16. 坑爹大冒险html5游戏在线玩,《史上最坑爹的大冒险》 图文全通关攻略
  17. mysql grant produce_ERROR 1045 (28000) Mysql中grant 使用不当导致的生产事故
  18. 汉诺塔III 汉诺塔IV 汉诺塔V
  19. 《淘宝网开店 拍摄 修图 设计 装修 实战150招》一一2.9 疏密相间构图法
  20. FAQ 检索式问答系统学习记录

热门文章

  1. 有意思的张飞日记-_-
  2. linux 怎么撤销移动命令,Linux的常用命令
  3. UML建模与软件开发设计(六)——类图设计与类之间的关系
  4. userdel: user * is currently used by process 1278
  5. 仿射密码加密解密(C语言)
  6. 那些让你“相见恨晚”的数据分析软件,一般人我不告诉他
  7. 安卓手机查看充放电电压、电流及功率
  8. 直流马达驱动_ADC_PWM加减速(STM32F4 CubeMX)
  9. CMD下添加IP地址,删除IP地址
  10. matlab函数之reshape()