Sudoku Killer

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 3723    Accepted Submission(s): 1170

Problem Description
自从2006年3月10日至11日的首届数独世界锦标赛以后,数独这项游戏越来越受到人们的喜爱和重视。
据说,在2008北京奥运会上,会将数独列为一个单独的项目进行比赛,冠军将有可能获得的一份巨大的奖品———HDU免费七日游外加lcy亲笔签名以及同hdu acm team合影留念的机会。
所以全球人民前仆后继,为了奖品日夜训练茶饭不思。当然也包括初学者linle,不过他太笨了又没有多少耐性,只能做做最最基本的数独题,不过他还是想得到那些奖品,你能帮帮他吗?你只要把答案告诉他就可以,不用教他是怎么做的。

数独游戏的规则是这样的:在一个9x9的方格中,你需要把数字1-9填写到空格当中,并且使方格的每一行和每一列中都包含1-9这九个数字。同时还要保证,空格中用粗线划分成9个3x3的方格也同时包含1-9这九个数字。比如有这样一个题,大家可以仔细观察一下,在这里面每行、每列,以及每个3x3的方格都包含1-9这九个数字。

例题:

答案:

 
Input
本题包含多组测试,每组之间由一个空行隔开。每组测试会给你一个 9*9 的矩阵,同一行相邻的两个元素用一个空格分开。其中1-9代表该位置的已经填好的数,问号(?)表示需要你填的数。
 
Output
对于每组测试,请输出它的解,同一行相邻的两个数用一个空格分开。两组解之间要一个空行。
对于每组测试数据保证它有且只有一个解。
 
Sample Input
   ?  ?
? ? ?
? ?
? ?
? ? ? ?
? ? ?
? ?
? ?
? ? ?
Sample Output

 
Author
linle
 
Source
 
Recommend
LL   |   We have carefully selected several similar problems for you:  1258 1045 2614 1067 1312 

 
  DFS搜索,进阶题目
  题意是给你多个数独题目,让你输出它们的答案。
  思路是递归确定每一个‘?’的位置的值,直到所有‘?’都被确定。先将原字符数组转换为整型数组,‘?’由数字0代替,然后每一次层递归找到第一个0的位置,如果找到了,找出当前位置所有可以放置的数字,依次尝试,每次假设把这个数放在当前位置,然后再确认下一个0位置的数字,直到数组中找不到0,即是正确结果(递归出口)。
  注意输入格式,要求输入的每组数据之间有一个空行,可以先单独输入第一组数据,后面的数据都是先读取空行,再读取数据。
  题目给的测试数据很弱,献上一组我的测试数据,如果你总是WA可以试试:
?  ?  ?  ? ?
? ? ? ? ?
? ? ? ? ?
? ? ? ?
? ? ? ? ? ?
? ? ? ? ?
? ? ? ? ?
? ? ? ? ?
? ? ? ? ?

  答案


  注意如果这一步的所有情况都判定失败,返回上一层递归的时候不要忘了将当前位置还原为“?”的状态,否则会影响以后的递归。

  代码量比别人长了一些,速度也达到了400MS左右,但好在关键地方都做了注释,代码还算好懂,看官们有改进意见可以跟我提。

  不费话了,上代码

 #include <stdio.h>
#include <iostream>
using namespace std;
void putoutint(int b[][]) //输出整型二维数组
{
int i,j;
for(i=;i<;i++){
for(j=;j<;j++)
if(j!=)
cout<<b[i][j]<<' ';
else
cout<<b[i][j];
cout<<endl;
}
}
void char2int(char a[][],int b[][]) //字符二维数组向整型二维数组转换
{
int i,j;
for(i=;i<;i++)
for(j=;j<;j++)
if(a[i][j]=='?')
b[i][j/] = ;
else if(''<=a[i][j] && a[i][j]<='')
b[i][j/] = a[i][j]-'';
}
bool judge(int curx,int cury,int num,const int b[][])
{
int i,j;
//查找一横行
for(i=;i<;i++) //将这一行出现的数字全部设为不可填
if(i!=cury && b[curx][i]==num)
return true;
//查找一竖列
for(i=;i<;i++) //将这一行出现的数字全部设为不可填
if(i!=curx && b[i][cury]==num)
return true;
//查找当前九宫格
int x,y;
x = curx/*;
y = cury/*;
for(i=;i<;i++)
for(j=;j<;j++)
if(x+i!=curx && y+j!=cury && b[x+i][y+j]==num)
return true;
return false;
}
bool dfs(int b[][])
{
//找到当前第一个'?'位置。如果没有找到,表示所有位置都已填上,即为正确结果,递归结束
int i,j;
for(i=;i<;i++)
for(j=;j<;j++)
if(b[i][j]==) //找'?'的位置
goto label;
label:
if(i>= && j>=) //找到正确结果了,递归结束
return true;
//记录坐标
int curx = i,cury = j;
//确定该位置的可以填的数字
bool temp[]; //记录哪些数字可以填
int num=; //记录当前位置可以填的数字的个数
for(i=;i<=;i++)
if(judge(curx,cury,i,b)) //判断这个位置可不可以放这个数字
temp[i] = false;
else {
temp[i] = true;
num++;
}
if(num==)
return false;
//确定下一个位置
for(i=;i<=;i++)
if(temp[i]){
//这个数在这个位置可以填
if(judge(curx,cury,i,b))
continue;
b[curx][cury] = i;
if(dfs(b))
return true;
}
b[curx][cury] = ; //这句千万别忘了写,就是这一步不能走的记得还原为0
return false;
}
int main()
{
char a[][];
int b[][];
int i;
for(i=;i<;i++)
cin.getline(a[i],,'\n');
char2int(a,b); //char数组转换为int数组
if(dfs(b)) //产生结果
putoutint(b); //输出数组内容 while(cin.getline(a[],,'\n')){ //读取空行,或者到文件尾
cout<<endl;
char a[][];
int b[][];
int i;
for(i=;i<;i++)
cin.getline(a[i],,'\n');
char2int(a,b); //char数组转换为int数组
if(dfs(b)) //产生结果
putoutint(b); //输出数组内容
}
return ;
}

Freecode : www.cnblogs.com/yym2013

hdu 1426:Sudoku Killer(DFS深搜,进阶题目,求数独的解)的更多相关文章

  1. hdu 1426 Sudoku Killer (dfs)

    Sudoku Killer Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Tot ...

  2. HDU 1426 Sudoku Killer(dfs 解数独)

    传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1426 Sudoku Killer Time Limit: 2000/1000 MS (Java/Oth ...

  3. HDU 1426 Sudoku Killer (回溯 + 剪枝)

    本文链接:http://i.cnblogs.com/EditPosts.aspx?postid=5398818 题意: 给你一个 9*9 的矩阵,同一行相邻的两个元素用一个空格分开.其中1-9代表该位 ...

  4. HDU 1426 Sudoku Killer【DFS 数独】

    自从2006年3月10日至11日的首届数独世界锦标赛以后,数独这项游戏越来越受到人们的喜爱和重视. 据说,在2008北京奥运会上,会将数独列为一个单独的项目进行比赛,冠军将有可能获得的一份巨大的奖品— ...

  5. hdu 1426 Sudoku Killer

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=1426 #include<stdio.h> #include<math.h> #in ...

  6. HDU 1426 Sudoku Killer(搜索)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1426 题意很明确,让你解一个9*9的数独. DFS即可. #include <cstdio> ...

  7. hdu 1426 Sudoku Killer ( Dancing Link 精确覆盖 )

    利用 Dancing Link 来解数独 详细的能够看    lrj 的训练指南 和 < Dancing Links 在搜索中的应用 >这篇论文 Dancing Link 来求解数独 , ...

  8. HUD 1426 Sudoku Killer (DFS)

    链接 : Here! 思路 : 记录下所有 "?" , 出现的位置, 然后 $DFS$ 一下, 对于每个位置来说都可以填充 $9$ 种数值, 然后对于判断填充是否合法需要三个标记数 ...

  9. CodeM美团点评编程大赛初赛B轮 黑白树【DFS深搜+暴力】

    [编程题] 黑白树 时间限制:1秒 空间限制:32768K 一棵n个点的有根树,1号点为根,相邻的两个节点之间的距离为1.树上每个节点i对应一个值k[i].每个点都有一个颜色,初始的时候所有点都是白色 ...

随机推荐

  1. Openerp workflow 工作流批注模块

    转自:http://blog.csdn.net/yeahliu/article/details/17207289 2013-12-22 添加workflow_stop标识,感谢广州-jerry 201 ...

  2. windows C:\documents and settings拒绝访问

      windows C:\documents and settings拒绝访问 CreationTime--2018年7月26日09点16分 Author:Marydon 1.情景再现 win+r-- ...

  3. 使用Eclipse构建Maven项目 (step-by-step) (转收藏)

    Maven这个个项目管理和构建自动化工具,越来越多的开发人员使用它来管理项目中的jar包.本文仅对Eclipse中如何安装.配置和使用Maven进行了介绍.完全step by step. 如果觉得本文 ...

  4. PHP 通过LDAP协议,操作Windows Active Directory

    原文地址:http://hi.baidu.com/lllangxx/item/3ccb7cdfa13b56eb3dc2cb39 一.学习如何管理Active Directory Active Dire ...

  5. 查看80port是否被占用

    windows下命令: netstat -ano|findstr "0.0:80"

  6. 无法启动此程序因为计算机中丢失 xxx.dll

    “无法启动此程序因为计算机中丢失 XXX.dll” 这类问题在 visual studio 中很常见… 许久不和VS打交道,一碰各种坑… 这是在 VS 2015 Community 出现的问题: (1 ...

  7. 【LeetCode】81. Search in Rotated Sorted Array II (2 solutions)

    Search in Rotated Sorted Array II Follow up for "Search in Rotated Sorted Array":What if d ...

  8. 【LeetCode】106. Construct Binary Tree from Inorder and Postorder Traversal

    Construct Binary Tree from Inorder and Postorder Traversal Given inorder and postorder traversal of ...

  9. 【LeetCode】114. Flatten Binary Tree to Linked List

    Flatten Binary Tree to Linked List Given a binary tree, flatten it to a linked list in-place. For ex ...

  10. 用Visual studio2012在Windows8上开发内核驱动监视线程创建

    在Windows NT中,80386保护模式的“保护”比Windows 95中更坚固,这个“镀金的笼子”更加结实,更加难以打破.在Windows 95中,至少应用程序I/O操作是不受限制的,而在Win ...