刚学的Dancing Link,也没打算自己去写一个十字链表的模板,就在网上找到了这个,嘿嘿,写的真心不错,以后有时间自己写个模板。

转载自:http://blog.csdn.net/lyhypacm/article/details/5923287

题意:

解决9*9的数独问题。

思路:

Dancing Link,不会的可以看我转的上一篇文章,讲解很详细,虽说Dancing Link不一定快,但是确实很好用。

代码:

#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>using namespace std;const int MAX=1000;
const int oo=0x3f3f3f3f;
const int nC=9*9*4;
const int delta[]={1,82,163,244};
const int head=0;int cnt[MAX],st[MAX];
int left[MAX*MAX],right[MAX*MAX],up[MAX*MAX],down[MAX*MAX];
int row[MAX*MAX],col[MAX*MAX];
struct Ans
{int r,c,k;
}ans[MAX*MAX];
int M,K;void remove(const int& c)
{left[right[c]]=left[c];right[left[c]]=right[c];for(int i=down[c];i!=c;i=down[i])for(int j=right[i];j!=i;j=right[j]){up[down[j]]=up[j];down[up[j]]=down[j];cnt[col[j]]--;}
}void resume(const int& c)
{for(int i=up[c];i!=c;i=up[i])for(int j=left[i];j!=i;j=left[j]){down[up[j]]=j;up[down[j]]=j;cnt[col[j]]++;}left[right[c]]=c;right[left[c]]=c;
}bool dfs(const int& k)
{if(right[head]==head){char s[100]={0};for(int i=0;i<k;i++)s[ans[st[i]].r*9+ans[st[i]].c]=ans[st[i]].k+'0';puts(s);return true;}int s=oo,c=0;for(int i=right[head];i!=head;i=right[i])if(cnt[i]<s){s=cnt[i];c=i;}remove(c);for(int i=down[c];i!=c;i=down[i]){st[k]=row[i];for(int j=right[i];j!=i;j=right[j])remove(col[j]);if(dfs(k+1))return true;for(int j=left[i];j!=i;j=left[j])resume(col[j]);}resume(c);return false;
}void init()
{left[head]=nC;right[head]=1;up[head]=down[head]=head;for(int i=1;i<=nC;i++){left[i]=i-1;right[i]=(i+1)%(nC+1);up[i]=down[i]=i;cnt[i]=0;col[i]=i;row[i]=0;}M=0;K=nC;
}int makecolhead(const int& c)
{K++;cnt[c]++;col[K]=c;row[K]=M;left[K]=right[K]=K;up[K]=c;down[K]=down[c];up[down[K]]=K;down[up[K]]=K;return K;
}void addcol(const int& id,const int& c)
{K++;cnt[c]++;col[K]=c;row[K]=M;left[K]=id;right[K]=right[id];left[right[K]]=K;right[left[K]]=K;up[K]=c;down[K]=down[c];up[down[K]]=K;down[up[K]]=K;
}void addrow(const int& i,const int& j,const int& k)
{int id;M++;ans[M].r=i;ans[M].c=j;ans[M].k=k+1;id=makecolhead(9*i+j+delta[0]);addcol(id,9*i+k+delta[1]);addcol(id,9*j+k+delta[2]);addcol(id,(i/3*3+j/3)*9+k+delta[3]);
}int main()
{char s[100];while(*gets(s)!='e'){init();for(int i=0;i<9;i++)for(int j=0;j<9;j++)if(s[i*9+j]=='.')for(int k=0;k<9;k++)addrow(i,j,k);elseaddrow(i,j,s[i*9+j]-'1');dfs(0);}  return 0;
}

poj3074(数独)相关推荐

  1. DFS剪枝——poj3074数独

    题目连接 Description In the game of Sudoku, you are given a large 9 × 9 grid divided into smaller 3 × 3 ...

  2. poj3074,3076 数独!(DLX)

    大意:求解规模为9*9的数独问题 分析:对于每一行,每一列,每一宫,数字1,2...9都需出现1次且只能是一次,可转化为精确覆盖问题,用跳舞链解决 建模型: 行数为9*9*9,数独中,第i行j列放数字 ...

  3. java解数独_java解数独

    先输入要解的数独,采用多维数组来保存其中的值,未填数字的地方,初始化为0,然后采用递归的方法来解数独. 直接上代码: /*** *@authorwalker **/ public classSudok ...

  4. C语言生成一个随机的九行九列数独,一个随机生成数独的C++程序

    下面是编程之家 jb51.cc 通过网络收集整理的代码片段. 编程之家小编现在分享给大家,也给大家做个参考. //mySIZE是数独棋盘的边长,棋盘是mySIZE*mySIZE的大小 int mySI ...

  5. Prolog学习:数独和八皇后问题

    上一篇简单介绍了下Prolog的一些基本概念,今天我们来利用这些基本概念解决两个问题:数独和八皇后问题. 数独 数独是一个很经典的游戏: 玩家需要根据n×n盘面上的已知数字,推理出所有剩余空格的数字, ...

  6. php数独游戏开发,使用vue如何开发数独游戏

    数独是源自18世纪瑞士的一种数学游戏,是一种运用纸.笔进行演算的逻辑游戏.下面这篇文章主要给大家介绍了关于利用vue开发一个所谓的数独的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下. ...

  7. LeetCode 36 Valid Sudoku(有效数独)(*)

    翻译 数独板被部分填充,空格部分用'.'来填充.一个部分填充的数组是否有效只需要看其填充的部分即可. 原文 代码 这道题写了一会,错了--因为输入太懒搞了,就直接看了别人写的-- class Solu ...

  8. 数独简化版 (set去重)

    数独是有趣的数学游戏,玩家需要根据9×9盘面上的已知数字,推理出所有剩余空格的数字,并满足每一行.每一列.9个3*3的小方格内的数字均含1-9,不重复.但是为了简化题目,本题的数独只需要满足前两个要求 ...

  9. 10.LeetCode第九题--有效的数独--哈希表的经典应用

    思路 一个简单的解决方案是遍历该 9 x 9 数独 三 次,以确保: 行中没有重复的数字. 列中没有重复的数字. 3 x 3 子数独内没有重复的数字. 实际上,所有这一切都可以在一次迭代中完成. 方法 ...

最新文章

  1. 中文版NCCN指南PPT分享(36本)
  2. Python--day41--事件和信号量之模拟连接数据库并在连接三次后抛出连接超时异常...
  3. 一个网站的诞生- MagicDict开发总结3 [日语字典数据结构]
  4. iOS7 企业应用无法安装应用程序 因为证书无效的解决方案
  5. python的scikit-learn算法库实现
  6. Flask博客开发——Tinymce编辑器
  7. springBoot的模版引擎
  8. php 5.4 aws,亚马逊AWS.EC2:Ubuntu安装php与apache环境
  9. 数组 排序 查找 多维数组
  10. execl执行linux命令,Excel 调用Shell命令执行bash脚本和命令行代码
  11. 云计算更适合小公司的八条原因
  12. LC-3 汇编语言 指令集
  13. 将SolidWorks物料清单导出到Excel时可带缩略图了!
  14. HCIA-IoT 个人学习总结 Day3
  15. RIME输入法配置双拼方案(Ubuntu下基于ibus)
  16. 电脑bios进入方法介绍
  17. STM32F103C8的keil环境配置和STlink烧录
  18. solr 查询出异常org.apache.solr.search.SyntaxError: Cannot parse
  19. 电脑硬件知识入门之内存篇
  20. 多因子模型matlab,【干货】不可不知的N种量化策略模型——量化因子

热门文章

  1. python numpy 子数组_Python快速转换numpy数组中Nan和Inf的方法实例说明
  2. 如何查询一个表中除某几个字段外其他所有的字段_一个小故事告诉你:如何写好数据分析报告?...
  3. VTK修炼之道67:体绘制讨论_不透明度传输函数
  4. PL/0语言编译程序分析
  5. 调用函数,判断各位数字立方和是否等于它本身
  6. Caused by: java.lang.NoClassDefFoundError: Lorg/sl
  7. MFC(WTL)编辑框长度限制
  8. 扎克伯格做了26张PPT
  9. PriorityQueue源码解析
  10. jvm垃圾收集器的发展史及回收算法