Sudoku KillerTime Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 12369 Accepted Submission(s): 3580

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
7 1 2 ? 6 ? 3 5 8
? 6 5 2 ? 7 1 ? 4
? ? 8 5 1 3 6 7 2
9 2 4 ? 5 6 ? 3 7
5 ? 6 ? ? ? 2 4 1
1 ? 3 7 2 ? 9 ? 5
? ? 1 9 7 5 4 8 6
6 ? 7 8 3 ? 5 1 9
8 5 9 ? 4 ? ? 2 3
Sample Output
7 1 2 4 6 9 3 5 8
3 6 5 2 8 7 1 9 4
4 9 8 5 1 3 6 7 2
9 2 4 1 5 6 8 3 7
5 7 6 3 9 8 2 4 1
1 8 3 7 2 4 9 6 5
2 3 1 9 7 5 4 8 6
6 4 7 8 3 2 5 1 9
8 5 9 6 4 1 7 2 3

个人思路:
一道深度优先搜索的题目,还是使用回溯。
读入:借用字符类型,存的时候存成整型。
记录:
1、将每一个’?‘的行和列记录下来。
2、用一个b标记数组(1~9),在对每一个’?‘填数寻找的时候,都要将其同行同列和一个九宫格的数都遍历一下(shudu数组中记录的数),其中已经存在的数据k就将b[k]置1。(注意每一次寻找都要开一个新的b标记数组。)
3、然后将1~9没有被置1的可以填入shudu,填入的时候可以标记一下,然后进行下一个’?‘的填充操作,回来的时候可以回溯一下。
边界条件:
1、如果这种填法不可以,就会变成在某一个’?'的填充时1~9找不到没有可以用的数,然后就会回溯,找一种新的策略。
2、如果这种填法是可以的,那就输出。
输出:
1、每一组答案之间要有换行,用fag_zu来记录,如果这是第一组解的话就不要输出换行,同时将fag_zu由0置1,如果这不是第一组解的话(fag_zu不是0)就要先输出换行然后在输出答案。
2、每一个数之间要用空格,也是用fag来标记是否是每一行的第一个数,做法同上。

做的时候的问题:
1、呃…一开始while循环输入那里没有太会,后来想着将第一个数作为while中的条件吧。就变成while(cin>>shuru[1][1])这样了。
2、就是发现杭电的很多输入都是无限次的那种,然后输出要求特变严格,所以不得不采用fag和fag_zu专门用要输出的标记。
3、感觉深搜要记录的东西挺多的。
4、比较的遗憾就是这道题我没有剪枝…没有想到应该怎么剪枝。

代码:

#include<iostream>
#include<string.h>
#include<stdio.h>
using namespace std;char shuru[10][10];
int shudu[10][10];
int hang[82];
int lie[82];
int num=0;//表示要填的数的数量
int fag_zu=0;//用来标记组解之间的空行 int dfs(int i)//表示定位 第几个数
{if(i>num)//表示达到了目的 {//输出一种解 if(fag_zu==0)//表示这是第一组解fag_zu=1;else{fag_zu=1;cout<<endl;}int fag;//用来标记输出空格的 for(int p=1;p<=9;p++){fag=0;//每一行的第一个数都不需要在前面输出空格 for(int p2=1;p2<=9;p2++){if(fag==0){fag=1;printf("%d",shudu[p][p2]);}elseprintf(" %d",shudu[p][p2]);}cout<<endl; } } bool b[10];//标记数组 1~9能不能用  每一次填数都要看一下哪个是能填的 int temp; memset(b,0,sizeof(b));//先表示现在这些数都没有被占用b[0]=1;//将0初始化 占用 int hang_zan=hang[i];int lie_zan=lie[i];//记下这个空位置的行列for(int j=1;j<=9;j++)//判断行列 {if(shudu[hang_zan][j]!=-1){ temp=shudu[hang_zan][j];b[temp]=1;//表示不能用了} if(shudu[j][lie_zan]!=-1){temp=shudu[j][lie_zan];b[temp]=1;}} for(int h=(hang_zan-1)/3*3+1; h<=(hang_zan-1)/3*3+3; h++)//判断九个格子 {for(int l=(lie_zan-1)/3*3+1; l<=(lie_zan-1)/3*3+3; l++){if(shudu[h][l]!=-1){temp=shudu[h][l];b[temp]=1;}}} for(int k=1;k<=9;k++)//(没有剪枝) {if(b[k]==0)//如果没有被占用 {b[k]=1;//占用一下 将这个数填进去 shudu[hang_zan][lie_zan]=k;dfs(i+1);//走向下一个b[k]=0;//回溯 shudu[hang_zan][lie_zan]=-1; }  }return 0;} int main()
{while(cin>>shuru[1][1])//用第一个字符的输入来当做每一组 {num=0;//每次都将num清一下0 for(int i=1;i<=9;i++)for(int j=1;j<=9;j++)if(i!=1||j!=1) cin>>shuru[i][j]; memset(shudu,0,sizeof(shudu));for(int i=1;i<=9;i++)for(int j=1;j<=9;j++){if(shuru[i][j]!='?'){shudu[i][j]=int(shuru[i][j]-'0');}else{shudu[i][j]=-1;num++;hang[num]=i;lie[num]=j;//记录下要填的数的行列号 }}dfs(1);} return 0;
}

杭电oj 1426 Sudoku Killer(深度优先搜索 回溯)相关推荐

  1. 【ACM】杭电OJ 1241(深度优先搜索小结)

    题目链接:杭电OJ 1241 深度优先搜索问题 深度优先搜索是搜索的手段之一.它从某个状态开始,不断地转移状态直到无法转移,然后回退到前一步的状态,继续转移到其他状态,如此不断重复,直至找到最终的解. ...

  2. 杭电OJ分类题目(1)

    原题出处:HDOJ Problem Index by Type,http://acm.hdu.edu.cn/typeclass.php 杭电OJ分类题目(1) HDU Introduction HDU ...

  3. 赛马网ACM试题(原杭电oj ACM)java版答案(1000,10001,1002)

    赛马网ACM试题(原杭电OJ ACM试题)答案(java版) Author : Zhang Hailong   Date   : 2015-09-17    HomePage : http://  E ...

  4. 【ACM】杭电OJ 2037

    题目链接:杭电OJ 2037 先把b[i]进行排序,然后,b[i]与a[i+1]进行比较. #include <iostream> #include <cstdio> #inc ...

  5. 【ACM】杭电OJ 2020(排序)

    题目链接:杭电OJ 2020 排序可以有冒泡排序,选择排序,或者直接调用函数. 下面是选择排序: #include <stdio.h> #include <math.h> in ...

  6. 【ACM】杭电OJ 2018

    题目链接:杭电OJ 2018 从n>4开始,每一年的牛的数量=前一年的牛的数量+三年前的牛的数量 问:为什么是三年前? 答:假设三年前有一头小牛出生,出生的那一年即为第一年,到了第四年,即三年后 ...

  7. 【ACM】杭电OJ 1005

     题目链接:杭电OJ 1005 超时代码如下(而且开辟的数组空间大小不够): #include <stdio.h> int m[100000]; int f(int n,int a,int ...

  8. 【ACM】杭电OJ 1004

     题目链接:杭电OJ 1004 运行环境:Dev-C++ 5.11 思路: 先把先把num数组全部赋值为1:第一个颜色单独输入,从第二个开始,需要与前面的进行比较,如果前面有相同的颜色,则在目前的nu ...

  9. 【ACM】杭电OJ 2012。

    题目链接:杭电OJ 2012 思路很简单,但是有一种高效算法显示编译错误,不知道为什么 运行环境:VS2017 AC代码: #include <stdio.h> #include < ...

最新文章

  1. 《windows核心编程系列》十八谈谈windows钩子
  2. ArduinoYun教程之ArduinoYun硬件介绍
  3. Struts2 - 在Action类中获得HttpServletResponse对象
  4. 李开复开发的国际象棋软件
  5. 安装VMware Tools 灰色解决办法
  6. 分布式事务中的CAP理论
  7. 啄木鸟下载器(全能版) v2021.01.05
  8. linux v4l2 python,v4l2 Python - 流视频 - 映射缓冲区
  9. 记一次Mysql查询字段为空串在java中使用equals不相等的问题
  10. Linux下使用shell脚本远程登录主机(Ubuntu CentOS)
  11. jQuery计算时间差和阴阳历转换
  12. QT小项目练手——用QTimer做一个倒计时程序
  13. 航旅纵横被质疑泄露用户数据;杭州网警破获67万台电脑数据遭黑客偷窃案;简历倒卖黑产:低至3毛一条,700元买采集器可无限量导数据...
  14. 元宵节主题微信红包封面序列号免费领取!
  15. 云计算中心怎么选址?
  16. 苹果电脑查看已经连上的WiFi密码(亲测可用)
  17. 蓝紫色食物对心血管最好
  18. 归并排序 (递归+非递归)
  19. 一句话读完:Spring Bean的生命周期
  20. Linux基础知识之常见基本操作

热门文章

  1. Ka波段卫星通信小尺寸无线电设计
  2. Qt学习笔记(二十七):QLabel 的常用方法
  3. PHPWAMP乱码一键解决,PHP乱码通用解决方案/网站乱码的多种原因分析
  4. 罗赛塔石碑Rosetta Stone安装教程
  5. 计算机基础原理知识,科普下计算机基础原理知识
  6. cf1239C (接热水)
  7. Py西游攻关之正则表达式
  8. SQL的基本和常用语句
  9. HDU-2094-产生冠军
  10. Cyber_monitor的使用