描述

数独是一种运用纸、笔进行演算的逻辑游戏。玩家需要根据9×9盘面上的已知数字,推理出所有剩余空格的数字,并满足每一行、每一列、每一个3*3宫内的 数字均含1-9,不重复。 每一道合格的数独谜题都有且仅有唯一答案,推理方法也以此为基础,任何无解或多解的题目都是不合格的。

有一天hrdv碰到了一道号称是世界上最难的数独的题目,作为一名合格的程序员,哪能随随便便向困难低头,于是他决定编个程序来解决它。。

输入
第一行有一个数n(0< n <100),表示有n组测试数据,每组测试数据是由一个9*9的九宫格构成,0表示对应的格子为空
输出
输出一个9*9的九宫格,为这个数独的答案
样例输入
  1. 1
  2. 0 0 5 3 0 0 0 0 0
  3. 8 0 0 0 0 0 0 2 0
  4. 0 7 0 0 1 0 5 0 0
  5. 4 0 0 0 0 5 3 0 0
  6. 0 1 0 0 7 0 0 0 6
  7. 0 0 3 2 0 0 0 8 0
  8. 0 6 0 5 0 0 0 0 9
  9. 0 0 4 0 0 0 0 3 0
  10. 0 0 0 0 0 9 7 0 0
样例输出
  1. 1 4 5 3 2 7 6 9 8
  2. 8 3 9 6 5 4 1 2 7
  3. 6 7 2 9 1 8 5 4 3
  4. 4 9 6 1 8 5 3 7 2
  5. 2 1 8 4 7 3 9 5 6
  6. 7 5 3 2 9 6 4 8 1
  7. 3 6 7 5 4 2 8 1 9
  8. 9 8 4 7 6 1 2 3 5
  9. 5 2 1 8 3 9 7 6 4

  DFS题,记着预处理。

  1. #include <stdio.h>
  2. #include <string.h>
  3. int arr[10][10], count;
  4. bool visrow[10][10], viscol[10][10], vissqu[10][10], ok;
  5. struct Node{
  6. int x, y;
  7. } tar[82];
  8.  
  9. int getsqunum(int i, int j){
  10. return i / 3 * 3 + j / 3;
  11. }
  12.  
  13. void print(){
  14. for(int i = 0; i < 9; ++i)
  15. for(int j = 0; j < 9; ++j)
  16. if(j != 8) printf("%d ", arr[i][j]);
  17. else printf("%d\n", arr[i][j]);
  18. }
  19.  
  20. bool check(int i, int j, int k){
  21. int t = getsqunum(i, j);
  22. if(visrow[i][k] || viscol[j][k] || vissqu[t][k]) return 0;
  23. return 1;
  24. }
  25.  
  26. void DFS(int k){
  27. if(k == count){ ok = 1; print(); return; }
  28. int t = getsqunum(tar[k].x, tar[k].y);
  29. for(int i = 1; i < 10; ++i){
  30. if(check(tar[k].x, tar[k].y, i)){
  31. visrow[tar[k].x][i] = 1;
  32. viscol[tar[k].y][i] = 1;
  33. vissqu[t][i] = 1;
  34. arr[tar[k].x][tar[k].y] = i;
  35.  
  36. DFS(k + 1);
  37. if(ok) return;
  38.  
  39. arr[tar[k].x][tar[k].y] = 0;
  40. visrow[tar[k].x][i] = 0;
  41. viscol[tar[k].y][i] = 0;
  42. vissqu[t][i] = 0;
  43. }
  44. }
  45. }
  46.  
  47. int main(){
  48. int n; scanf("%d", &n);
  49. while(n--){
  50. memset(viscol, 0, sizeof(viscol));
  51. memset(visrow, 0, sizeof(visrow));
  52. memset(vissqu, 0, sizeof(vissqu));
  53. count = 0;
  54. for(int i = 0; i < 9; ++i)
  55. for(int j = 0; j < 9; ++j){
  56. scanf("%d", &arr[i][j]);
  57. if(arr[i][j]){
  58. visrow[i][arr[i][j]] = 1;
  59. viscol[j][arr[i][j]] = 1;
  60. vissqu[getsqunum(i, j)][arr[i][j]] = 1;
  61. }else{
  62. tar[count].x = i;
  63. tar[count++].y = j;
  64. }
  65. }
  66. ok = 0;
  67. DFS(0);
  68. }
  69. return 0;
  70. }

ACM题目————数独的更多相关文章

  1. ACM题目————中缀表达式转后缀

    题目描述 我们熟悉的表达式如a+b.a+b*(c+d)等都属于中缀表达式.中缀表达式就是(对于双目运算符来说)操作符在两个操作数中间:num1 operand num2.同理,后缀表达式就是操作符在两 ...

  2. HDU ACM 题目分类

    模拟题, 枚举1002 1004 1013 1015 1017 1020 1022 1029 1031 1033 1034 1035 1036 1037 1039 1042 1047 1048 104 ...

  3. ACM题目推荐(刘汝佳书上出现的一些题目)[非原创]

    原地址:http://blog.csdn.net/hncqp/article/details/1758337 推荐一些题目,希望对参与ICPC竞赛的同学有所帮助. POJ上一些题目在http://16 ...

  4. 有一种acm题目叫做,奇葩!

    本文全然没有技术含量,纯粹是娱乐. 我事实上想写点东西.可是近期好像做计算几何做得太多了,一种想说说不出东西的感觉,唯有写一下一些奇葩的题目了. HDU3337:Guess the number pi ...

  5. ACM题目————STL练习之求次数

    题目地址:http://acm.nyist.net/JudgeOnline/problem.php?pid=1112 描述 题意很简单,给一个数n 以及一个字符串str,区间[i,i+n-1] 为一个 ...

  6. ACM题目————zoj问题

    题目1006:ZOJ问题 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:20322 解决:3560 题目描述: 对给定的字符串(只包含'z','o','j'三种字符),判断他是否能AC. ...

  7. ACM题目————又见拦截导弹

    描述 大家对拦截导弹那个题目应该比较熟悉了,我再叙述一下题意:某国为了防御敌国的导弹袭击,新研制出来一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:它的第一发炮弹能够到达任意的高度,但是以后每一发炮 ...

  8. ACM题目————还是畅通工程

    Submit Status Description 某省调查乡村交通状况,得到的统计表中列出了任意两村庄间的距离.省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路 ...

  9. ACM题目————小A的计算器

    Description 以往的操作系统内部的数据表示都是二进制方式,小A新写了一个操作系统,系统内部的数据表示为26进制,其中0-25分别由a-z表示.  现在小A要在这个操作系统上实现一个计算器,这 ...

随机推荐

  1. iOS 黑屏

    1. 首先看操作系统是否有很多Bug 9.0.2 的系统不稳定. http://tech.163.com/15/1020/05/B6BL6PML000915BD.html

  2. RequireJS初探

    什么是RequireJS? /* --- RequireJS 是一个JavaScript模块加载器.它非常适合在浏览器中使用, 它非常适合在浏览器中使用,但它也可以用在其他脚本环境, 就像 Rhino ...

  3. Java数组(初学者必看)

    数组无论在哪种编程语言中都算是最重要的数据结构之一,同时不同语言的实现及处理也不尽相同.但凡写过一些程序的人都知道数组的价值及理解数组的重要性,与链表一道,数组成为了基本的数据结构.尽管Java提供了 ...

  4. SpringMVC注解@RequestParam全面解析

    在SpringMVC后台控制层获取参数的方式主要有两种,一种是request.getParameter("name"),另外一种是用注解@RequestParam直接获取.这里主要 ...

  5. Ubuntu Firefox installs Flashplayer

    Adobe flash 下载(https://get.adobe.com/flashplayer/)  tar.gz版本(注:adobe 提供了yum,rpm,tar.gz和APT四种版本,yum和t ...

  6. POJ 3356 AGTC(DP-最小编辑距离)

    Description Let x and y be two strings over some finite alphabet A. We would like to transform x int ...

  7. PAT乙级 1026. 程序运行时间(15)

    1026. 程序运行时间(15) 时间限制 200 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 要获得一个C语言程序的运行时间, ...

  8. 一个noconsole程序

    貌似是一个外国人写的,作用应该是让控制台的程序运行的时候不会弹出那个控制台黑框.想用来让它不显示 php-cgi.exe 运行后的窗口,可是效果不是预期的. 项目在 github 的位置:https: ...

  9. java 网络编程(五)----TCP进阶篇上传文本文件

    设计需求:从客户端上传txt文件到服务器,服务端收到文件后,发送消息给客户端接收完成. 1. 服务器端: public class UpLoadFileServer { public static v ...

  10. yii2多语言

    1.页面视图(我放在了布局文件main.php中): <a href="javascript:;" onclick="changeLanguage('zh-CN') ...