POJ 2676 Sudoku【DancingLinks,数独】


http://poj.org/problem?id=2676
POJ 2676 Sudoku
也是求解规模为9*9的数独问题,与POJ 3074 Sudoku相同的问题,只是修改了输入输出格式而已。。。
所以也不废话了,嘿嘿。。。

#include<stdio.h>
#include<string.h>
const int MAX_COLOUMN = 81+9*9+9*9+9*9+2;//最多出现列数
const int MAX_ROW = 81*9+2;//最多出现的列数int cnt[MAX_COLOUMN];//cnt[i]统计第i列1的个数
int most,coloumn;
bool ans[MAX_ROW];//ans存放最终选中的行
//跳舞链中的节点
struct Point
{int up,down,left,right;//上,下,左,右int coloumn;//该点所在的列标int row;//行标
}node[MAX_ROW*MAX_COLOUMN+MAX_COLOUMN];//初始化跳舞链信息为空
void init(int m)
{int i;for(i=0;i<=m;i++){node[i].down=i;node[i].up = i;node[i].coloumn=i;node[i].left=i-1;node[i].right=i+1;cnt[i]=0;}node[0].left = m;node[m].right = 0;
}void remove(int c)//删除c列上所有1元素所在的行
{node[node[c].right].left=node[c].left;node[node[c].left].right=node[c].right;int t,tt;for(t=node[c].down;t!=c;t=node[t].down)//从上到下从左到右删除该列上的每一非零元素所在行信息{for(tt = node[t].right;tt!=t;tt=node[tt].right)//删除非零元素所在行{cnt[node[tt].coloumn]--;node[node[tt].down].up = node[tt].up;node[node[tt].up].down = node[tt].down;}}
}void resume(int c)//还原c列上所有1元素所在的行
{int t,tt;for(t=node[c].up;t!=c;t=node[t].up)//从下往上从左到右还原该c列中1所在的行信息{for(tt=node[t].left;tt!=t;tt=node[tt].left){cnt[node[tt].coloumn]++;node[node[tt].up].down=tt;node[node[tt].down].up=tt;}}node[node[c].right].left=c;node[node[c].left].right=c;
}bool dfs(int k)//k为已经选中的行的数目
{int i,j;if(k>=most)return false;if(node[coloumn].right == coloumn)//当前跳舞链已为空{if(k<most)most = k;return true;}int t = coloumn+1;int c;//选取当前矩阵中1最少的列for(i=node[coloumn].right;i!=coloumn;i=node[i].right){if(cnt[i]<t){c=i;t=cnt[i];if(t==1)break;}}remove(c);//删除列c中所有1所在的行//删除时从左到右从上到下,还原时从下到上,从右到左for(i = node[c].down;i!=c;i=node[i].down){for(j=node[i].right;j!=i;j=node[j].right){remove(node[j].coloumn);}ans[node[j].row]=true;if(dfs(k+1)){return true;}ans[node[j].row]=false;for(j=node[j].left;j!=i;j=node[j].left){resume(node[j].coloumn);}}resume(c);return false;
}
bool graph[MAX_ROW][MAX_COLOUMN];
void addrow(int i,int j,int k)
{int curr = (i*9+j)*9+k;graph[curr][(i*9+j)]=true;graph[curr][81+i*9+k]=true;graph[curr][81+81+j*9+k]=true;int tr = i/3;int tc = j/3;graph[curr][81+81+81+(tr*3+tc)*9+k]=true;
}char str[MAX_ROW];
int main()
{int N,M,i,j,k;int T;while(scanf("%d",&T)!=EOF){while(T--){N=81*9;M = 9*9+9*9+9*9+9*9;coloumn = M;int cur=coloumn+1;//当前节点编号init(coloumn);memset(graph,0,sizeof(graph));for(i=0;i<9;i++){scanf("%s",str);for(j=0;j<9;j++){if(str[j]=='0'){for(k=0;k<9;k++)//遍历每一种颜色{addrow(i,j,k);}continue;}k = str[j]-'1';addrow(i,j,k);}}for(i=0;i<N;i++){int start = cur;//记录第i列的开始点编号int pre = cur;//记录该列中当前1的左边第一个1编号for(j=0;j<M;j++){// scanf("%d",&n);if(graph[i][j])//跳舞链中仅插入非0元素{int pos = j;node[cur].up = node[pos].up;node[node[pos].up].down = cur;node[cur].down = pos;node[pos].up = cur;cnt[pos]++;//该列1的个数+1node[cur].coloumn = pos;node[cur].left = pre;node[pre].right = cur;node[cur].right = start;node[start].left=cur;node[cur].row = i;pre=cur++;}}}most = N+1;//记录最少需要选中的行数memset(ans,false,sizeof(ans));dfs(0);// printf("Yes, I found it\n");for(i=0;i<81;i++){ if(i!=0&&i%9==0)printf("\n");for(j=0;j<9;j++)if(ans[i*9+j]){printf("%d",j+1);break;}}printf("\n");}}return 0;
}

转载于:https://www.cnblogs.com/AndreMouche/archive/2011/02/24/1964147.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/410713.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Unittest方法 -- 测试固件(TestFixture)

前置和后置 1.setUp&#xff1a;在写测试用例的时候&#xff0c;每次操作其实都是基于打开浏览器输入对应网址这些操作&#xff0c;这个就是执行用例的前置条件。2.tearDown&#xff1a;执行完用例后&#xff0c;为了不影响下一次用例的执行&#xff0c;一般有个数据还原的过程…

[html] 如何关闭HTML页面在IOS下的键盘首字母自动大写?

[html] 如何关闭HTML页面在IOS下的键盘首字母自动大写&#xff1f;&#xff1f; autocapitalize"none"或"off"个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一…

所谓语音合成 是计算机根据语言学,计算语言学完整1

计算语言学第一节计算语言学概说概念&#xff1a;计算语言学(computational linguistics)是用计算机研究和处理自然语言的一门新兴边缘学科。涉及语言学、计算机科学、数学等多个领域。旨在通过建立形式化的数学模型&#xff0c;来分析处理自然语言&#xff0c;并在计算机上用程…

再深入 HTTP Referer【转】

简言之&#xff0c;HTTP Referer是header的一部分&#xff0c;当浏览器向web服务器发送请求的时候&#xff0c;一般会带上Referer&#xff0c;告诉服务器我是从哪个页面链接过来的&#xff0c;服务器籍此可以获得一些信息用于处理。 比如从我主页上链接到一个朋友那里&#xff…

剑指:树的子结构

题目描述输入两棵二叉树 A、B&#xff0c;判断 B 是不是 A 的子结构。 我们规定空树不是任何树的子结构。 样例 树 A&#xff1a; 8 / \ 8 7 / \ 9 2 / \ 4 7 树 B&#xff1a; 8 / \ 9 2 返回 true ,因为 B 是 A 的子结构。 解法递归方式遍历&#xff1a; 在树 A 中找到和树 B…

[html] 页面的重绘和回流是什么?

[html] 页面的重绘和回流是什么&#xff1f; 由于节点的几何属性发生改变或者由于样式发生改变而不会影响布局的&#xff0c;称为重绘。回流是布局或者几何属性需要改变就称为回流。回流必定会发生重绘&#xff0c;重绘不一定会引发回流。个人简介 我是歌谣&#xff0c;欢迎和…

QT中IDirect3DDevice9的Present方法失败情况的处理笔记

这几天在试着使用QT做编辑器&#xff0c;然后打算使用Irrlicht作为渲染引擎。结果在集成的时候遇到了问题。 使用了Irrlicht论坛里面有人提供的QIrrlichtWidget&#xff0c;结果什么都画不出来。仔细跟踪了一下&#xff0c;结果是IDirect3DDevice9的Present函数返回了E_FAIL。 …

html5图片长按保存,一文彻底解决HTML5页面中长按保存图片功能

$.fn.longPress function(fn) {let timeout 0;const $this this;for (let i 0; i < $this.length; i) {$this[i].addEventListener(touchstart, () > {timeout setTimeout(fn, 800); // 长按时间超过800ms&#xff0c;则执行传入的方法}, false);$this[i].addEventL…

[html] 页面的重绘和回流是什么?

[html] 页面的重绘和回流是什么&#xff1f; 由于节点的几何属性发生改变或者由于样式发生改变而不会影响布局的&#xff0c;称为重绘。回流是布局或者几何属性需要改变就称为回流。回流必定会发生重绘&#xff0c;重绘不一定会引发回流。

(转)深入理解Java中的final关键字

转自&#xff1a;http://www.importnew.com/7553.html Java中的final关键字非常重要&#xff0c;它可以应用于类、方法以及变量。这篇文章中我将带你看看什么是final关键字&#xff1f;将变量&#xff0c;方法和类声明为final代表了什么&#xff1f;使用final的好处是什么&…

jsp servlet中的过滤器Filter配置总结(转)

在Java web开发中常会使用到功能强大的过滤器&#xff0c;他毕竟能给我们带来很大的方便&#xff0c;但是针对过滤的资源我们需要详细的了解他们在web.xml中的配置信息。这个根据几种常用的不同情况进行了总结&#xff1a; 1。如果要映射过滤应用程序中所有资源&#xff1a; &l…

[html] 你最喜欢H5的哪些功能?为什么?

[html] 你最喜欢H5的哪些功能&#xff1f;为什么&#xff1f; 我最喜欢H5中包含的地理定位功能&#xff0c;通过调用geolocation api&#xff0c;用户允许定位后即可获取客户端wgs84坐标信息&#xff1b;相比于某些服务商如IP Geolocation API、百度地图 &#xff08;仅限于国…

关于spring MVC 绑定json字符串与实体类绑定

1 如果前台传json字符串&#xff0c;后台用RequestBody 接收前端"content-Type":"application/json",2 前台用form表单形式提交 后台直接写实体类参数"content-Type":"application/x-www-form-urlencoded",转载于:https://www.cnblog…

fedora下配置ipv6 dns服务器

操作系统&#xff1a;fedora14 DNS版本&#xff1a;dnsmasq2.52 或者 bind9.x dnsmasq2.52是fedora14自带的&#xff0c;所以我选择了这个&#xff0c;而且使用起来也很方便&#xff0c;是一种轻量级的dns server&#xff0c;相对来说bind就比较专业&#xff0c;但是搭建很复杂…

应用计算机网络的方面,计算机网络技术在电子信息工程中的应用研究(1)

杨浩章 叶雨泓 杨鹏进摘要&#xff1a;在科技飞速发展的21世纪&#xff0c;人类文明已经达到了前所未有的阶段。互联网随着新时代也逐渐进入日常生活中。电子信息技术广泛应用于社会生活中&#xff0c;计算机网络技术与电子信息技术的兴起会对社会产生何种影响&#xff0c;两者…

[html] 你觉得新开发一个网站最困难的是哪些部分?

[html] 你觉得新开发一个网站最困难的是哪些部分&#xff1f; 提高网站安全性&#xff0c;比如网站有论坛方面的功能&#xff0c;那需要保证不让黑客通过拦截请求信息&#xff0c;发起对论坛信息的破解。在比如DDOS 攻击个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后…

Abraca:XMMS2 的客户端

Toy Posted in AppsRSSTrackback Abraca 是基于 GTK2 而开辟的 XMMS2 音乐播放器的客户端。今后具有播放列表、音乐经管等功用。需留神的是&#xff0c;此法式要求 XMMS2、GTK 2、libglade、libnotify&#xff08;可选&#xff09;、Python 等。- Download Abraca 0.1版权声明&…

无序字母对

题目描述 给定n个各不相同的无序字母对&#xff08;区分大小写&#xff0c;无序即字母对中的两个字母可以位置颠倒&#xff09;。请构造一个有n1个字母的字符串使得每个字母对都在这个字符串中出现。 输入输出格式 输入格式&#xff1a; 第一行输入一个正整数n。 以下n行每行两…

用计算机打出二分之一,win10手机计算器怎么输入二分之一?

win10系统的电脑方法/步骤首先单击桌面下方的开始菜单&#xff0c;或者按一下win键打开开始菜单的面板。在开始面板里单击所有应用&#xff0c;展开所有的应用。找到计算器并单击鼠标左键打开它。在此处我们如果单击鼠标右键可以选择将计算器固定到“开始”菜单和任务栏&#x…

pandas plot label_数据科学| 手把手教你用 pandas 索引、汇总、处理缺失数据

作者&#xff1a;Paul编者按&#xff1a; pandas提供了很多常用的数学和统计方法&#xff0c;本文中将用十分详细的例子来具体进行介绍&#xff1b;另外在许多数据分析工作中,缺失数据是经常发生的&#xff0c;将会具体介绍如何处理缺失数据。本文十分详细并实在低介绍了pandas…