http://poj.org/problem?id=2676

题意 : 这个是我最喜欢玩的数独了,就是一个9乘9的宫格,填上1到9九个数字,每行每列每个宫格之内不能有重复的数字,给出的九宫格中,0是待填的数字,其他数字是已经填好的,若是无法按要求填出来,就输出原来的九宫格;

思路 : DFS,深搜递归一下,设三个标记数组,标记一下每行的,每列的,每个宫格的,如果这个数字出现了,就标记了就行,我代码里写的是标记数组row[ i ][ j ],代表的是第 i 行的 j 已经出现了,col[ i ][ j ]代表的是第 i 行的 j 数组存在,map[ i ][ j ]宫格 i 的 j 这个数字存在,而宫格的话大家可以自己想一下,如果一个位置的行和列是x,y,那么他所在的九宫格就应该是3*((x-1)/3)+(y-1)/3+1,但如果你往里输入的九宫格下标是从0开始的话,这个就要变成x/3*3+y/3,我也试过,但是从0开始存一直都是错的,后来就改为从一开始存了

  1. #include<cstring>
  2. #include<cstdio>
  3. #include<iostream>
  4. using namespace std;
  5. int row[][],col[][],map[][];//行列宫格的标记数组
  6. int Sudoku[][];
  7. int flag ;//标记变量
  8. int DFS(int x,int y)
  9. {
  10. if(x == )
  11. {
  12. for(int i = ; i <= ; i++)
  13. {
  14. for(int j = ; j <= ; j++)
  15. printf("%d",Sudoku[i][j]);
  16. printf("\n");
  17. }
  18. return ;
  19. }
  20. flag = ;
  21. if(Sudoku[x][y])//该位置原本是有数字的
  22. {
  23. if(y == )
  24. flag = DFS(x+,);
  25. else
  26. flag = DFS(x,y+);
  27. if(flag)
  28. return ;
  29. else
  30. return ;
  31. }
  32. else
  33. {
  34. for(int i = ; i <= ; i++)
  35. if(!row[x][i] && !col[y][i] && !map[*((x-)/)+(y-)/+][i])//如果行列宫格都没有这个数字
  36. {
  37. Sudoku[x][y] = i;//就填上这个数字,然后下边的行列宫格都标记为已填此数字
  38. row[x][i]= ;
  39. col[y][i]= ;
  40. map[*((x-)/)+(y-)/+][i] = ;
  41. if(y == )
  42. flag=DFS(x+,);
  43. else
  44. flag=DFS(x,y+);
  45. if(!flag)//如果没找到合适的,就全部返回原值
  46. {
  47. Sudoku[x][y]=;
  48. row[x][i] = ;
  49. col[y][i]= ;
  50. map[*((x-)/)+(y-)/+][i]=;
  51. }
  52. else
  53. return ;
  54. }
  55. }
  56. return ;
  57. }
  58. void Init()
  59. {
  60. memset(row,,sizeof(row));
  61. memset(col,,sizeof(col));
  62. memset(map,,sizeof(map));
  63. }
  64. int main()
  65. {
  66. int i,j,n;
  67. scanf("%d",&n);
  68. for(int s = ; s < n ; s++)
  69. {
  70. Init();
  71. for(i = ; i <= ; i++)
  72. for(j = ; j <= ; j++)
  73. {
  74. scanf("%1d",&Sudoku[i][j]);
  75. if(Sudoku[i][j])
  76. {
  77. row[i][Sudoku[i][j]] = ;
  78. col[j][Sudoku[i][j]] = ;
  79. map[*((i-)/)+(j-)/+][Sudoku[i][j]] = ;
  80. }
  81. }
  82. DFS(,);
  83. }
  84. return ;
  85. }

POJ2676Sudoku的更多相关文章

  1. POJ2676Sudoku(类似于八皇后)

    Sudoku Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 16444   Accepted: 8035   Special ...

  2. POJ2676-Sudoku(数独)

    想了好久没想到好的解决办法,参考了 http://user.qzone.qq.com/289065406/blog/1303713313 大致题意: 九宫格问题,也有人叫数独问题 把一个9行9列的网格 ...

  3. 【基础搜索】poj-2676-Sudoku(数独)--求补全九宫格的一种合理方案

      数独 时限:2000 MS   内存限制:65536K 提交材料共计: 22682   接受: 10675   特别法官 描述 数独是一个非常简单的任务.一个9行9列的正方形表被分成9个较小的3x ...

  4. HDU 1426 Sudoku Killer【DFS 数独】

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

随机推荐

  1. Qt获得网页源码

    1.工程中添加网络模块 打开你的.pro文件插入以下代码 QT += network 2.添加代码 CodeQString NetWork::getWebSource(QUrl url) { QNet ...

  2. 引入OO开发报表后的感想

    很早就想尝试着在常规的报表开发中 引入OO了 趁着程序略复杂 时间略充裕 终于尝试了一把-咩哈哈~~ 以下来自我的evernote笔记 有点语无伦次-忍忍~~ -------------------- ...

  3. Error: An App ID with identifier "*****" is not avaliable. Please enter a different string.

    Error: An App ID with identifier "*****" is not avaliable. Please enter a different string ...

  4. <hash命令:显示、添加或清除哈希表>

    linux系统下的hash指令: 说明:linux系统下会有一个hash表,当你刚开机时这个hash表为空,每当你执行过一条命令时,hash表会记录下这条命令的路径,就相当于缓存一样.第一次执行命令s ...

  5. C# 语言如何获取json格式的数据,不用javascript用c#实现。。。

    {'state' : 1,'data':{'list':[{'id': 123, 'name': '诸葛天邪','level': 10,'country': 1,}]}} 比如我要获取里面的 id 该 ...

  6. sql临时表和表变量

    1. 为什么要使用表变量 表变量是从2000开始引入的,微软认为与本地临时表相比,表变量具有如下优点:  a.与其他变量的定义一样,表变量具有良好的定义范围,并会被自动清除:  b.在存储过程中使用表 ...

  7. win7 IIS 7.5 HTTP 错误 404.3 - Not Found

    HTTP 错误 404.3 - Not Found 由于扩展配置问题而无法提供您请求的页面.如果该页面是脚本,请添加处理程序.如果应下载文件,请添加 MIME 映射. 解决这个问题你只需要,打开控制面 ...

  8. python:执行一个命令行N次

    经常希望可以执行一个命令行N次...windows下没有现成的工具(有?推荐给我!) 用python写一个... #!/usr/bin/evn python #coding: utf-8 " ...

  9. Windows Server 2008 R2 64bit兼容Chrome浏览器

    近日更换系统Windows Server 2008 R2 64bit系统,发现谷歌浏览器插件无法正常运行,终于找到如下解决方案: 打开桌面谷歌浏览器属性,将target目标 C:\Users\Admi ...

  10. linux 进程控制笔记

    进程创建 普通函数调用完成后,最多返回(return)一次,但fork/vfork会返回二次,一次返回给父进程,一次返回给子进程 父进程的返回值为子进程的进程ID,子进程的返回值为0 1.pid_t ...