题目大意:

九宫格问题,也有人叫数独问题

把一个9行9列的网格,再细分为9个3*3的子网格,要求每行、每列、每个子网格内都只能使用一次1~9中的一个数字,即每行、每列、每个子网格内都不允许出现相同的数字。

0是待填位置,其他均为已填入的数字。

要求填完九宫格并输出(如果有多种结果,则只需输出其中一种)

如果给定的九宫格无法按要求填出来,则输出原来所输入的未填的九宫格

思路:

DFS 深搜

char map[10][10];/*数据存储*/
bool row[10][10];/*行存在数*/
bool col[10][10];/*列存在数*/
bool grid[10][10];/*格存在数*/

  1 /*poj2676 Sudoku*/
  2 #include <iostream>
  3 #include <cstdio>
  4 #include <cstring>
  5 using namespace std;
  6
  7 char map[10][10];
  8 bool row[10][10];/*行存在数*/
  9 bool col[10][10];/*列存在数*/
 10 bool grid[10][10];/*格存在数*/
 11
 12 bool dfs(int x, int y)
 13 {
 14     if(x == 10)
 15         return true;
 16     bool flag = false;
 17     if(map[x][y] - '0')
 18     {
 19         if(y == 9)
 20             flag = dfs(x+1, 1);
 21         else{
 22             flag = dfs(x, y+1);
 23         }
 24         if(flag)
 25             return true;
 26         else{
 27             return false;
 28         }
 29     }
 30     else{
 31         for(int i = 1; i<= 9; i++)
 32         {
 33             if(!row[x][i] && !col[y][i] && !grid[3*((x-1)/3) + (y-1)/3 + 1][i])
 34             {
 35                 map[x][y] = i+'0';
 36                 row[x][i] = true;
 37                 col[y][i] = true;
 38                 grid[3*((x-1)/3) + (y-1)/3 + 1][i] = true;
 39
 40                 if(y == 9)
 41                     flag = dfs(x+1, 1);
 42                 else{
 43                     flag = dfs(x, y+1);
 44                 }
 45                 if(!flag)
 46                 {
 47                     map[x][y] = '0';
 48                     row[x][i] = false;
 49                     col[y][i] = false;
 50                     grid[3*((x-1)/3) + (y-1)/3 + 1][i] = false;
 51
 52                 }
 53                 else{
 54                     return true;
 55                 }
 56             }
 57         }
 58     }
 59     return false;
 60 }
 61
 62 void judge()
 63 {
 64     memset(row, 0, sizeof(row));
 65     memset(col, 0, sizeof(col));
 66     memset(grid, 0, sizeof(grid));
 67
 68     for(int i = 1; i<= 9; i++)
 69     {
 70         for(int j = 1; j<= 9; j++)
 71         {
 72             if(map[i][j] != '0')
 73             {
 74                 row[i][map[i][j]-'0'] = true;
 75                 col[j][map[i][j]-'0'] = true;
 76                 grid[3*((i-1)/3) + (j-1)/3 + 1][map[i][j]-'0'] = true;
 77             }
 78         }
 79     }
 80 /*    for(int i = 1; i<= 9; i++)
 81     {
 82         for(int j = 1; j<= 9; j++)
 83             cout<<grid[i][j];
 84         printf("\n");
 85     }
 86     printf("\n");
 87 */
 88 }
 89
 90 void solve()
 91 {
 92     memset(map, 0, sizeof(map));
 93     for(int i = 1; i<= 9; i++)
 94     {
 95         gets(map[i] +1);
 96     }
 97     judge();
 98     dfs(1, 1);
 99
100     for(int i = 1; i<= 9; i++)
101         puts(map[i] + 1);
102     printf("\n");
103 }
104
105 int main()
106 {
107     int t;
108 //    freopen("test.txt", "r", stdin);
109     scanf("%d", &t);
110     getchar();
111     while(t--)
112     {
113         solve();
114     }
115     return 0;
116 }

转载于:https://www.cnblogs.com/ygdblogs/p/4929849.html

Poj 2676 Sudoku[dfs]相关推荐

  1. POJ - 2676 Sudoku(dfs)

    题目链接:点击查看 题目大意:解数独,具体规则是,在一个9*9的区域内填充1~9的数字,要求: 每列不许有重复数字 每行不许有重复数字 每个3*3的九宫格内不许有重复数字 题目分析:因为至多只有81个 ...

  2. POJ 2676 Sudoku【DancingLinks,数独】

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

  3. POJ 2676 Sudoku (数独求解器 DFS)

    题目链接 POJ2676 题目大意 输入n个数独,空格用0表示,填数独(符合的一种方案即可). 分析 类似于八皇后的简单搜索题,用DFS回溯法求解. 将空格的位置都记录下来,1个1个填下去,填不下去就 ...

  4. POJ 2676 Sudoku 数独

    点击打开链接 Sudoku Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 12360   Accepted: 6168   ...

  5. POJ - 2386 (dfs简单应用)

    POJ - 2386 (dfs深度优先搜索) 题目正文: Due to recent rains, water has pooled in various places in Farmer John' ...

  6. 【POJ - 2676】Sudoku (经典深搜,dfs数独)

    题干: Sudoku is a very simple task. A square table with 9 rows and 9 columns is divided to 9 smaller s ...

  7. POJ 2676/2918 数独(dfs)

    思路:记录每行每列每一个宫已经出现的数字就可以.数据比較弱 另外POJ 3074 3076 必须用剪枝策略.但实现较麻烦,还是以后学了DLX再来做吧 //Accepted 160K 0MS #incl ...

  8. POJ 2386(DFS)

    深度优先搜索属于图算法的一种,英文缩写为DFS即Depth First Search.其过程简要来说是对每一个可能的分支路径深入到不能再深入为止,而且每个节点只能访问一次. 举例说明之:下图是一个无向 ...

  9. TOJ 3287 Sudoku dfs

    3287: Sudoku 描述 Sudoku is a very simple task. A square table with 9 rows and 9 columns is divided to ...

最新文章

  1. 5 种将死的编程语言!
  2. python在excel中的应用-Python利用pandas处理Excel数据的应用详解
  3. c语言变量作为数组长度,为什么在C中不允许将数组的大小作为常量变量但在C中允许?...
  4. 由浅到深理解ROS(6)-坐标转换
  5. java class 文件分析_大概优秀的java程序员都要会分析class文件吧
  6. 【系列7】使用Dockerfile创建带mysql5.7的Centos Docker镜像1
  7. 蓝桥杯 ALGO-106 算法训练 6-3判定字符位置
  8. 2012/7/25Extjs学习随笔
  9. 阿里13篇论文入选数据库顶会!PolarDB技术被认为引领数据库发展方向
  10. 设置vim默认显示行号
  11. CDN、SCDN、DCDN是什
  12. 计算机为什么逻辑判断准确,逻辑判断之评价型答题技巧
  13. 新手小白学JAVA IO流 File 字节流 字符流
  14. webgame开发入门
  15. 路由协议常见FAQ-V1.1
  16. Hou的图像显著性计算模型
  17. matlab plot函数详解
  18. 【R实验.8】方差分析
  19. 【递推】HDU -2018 母牛的故事斐波那契兔子数列
  20. linux下usb充电问题,如何解决在Ubuntu上iPad不能充电的问题

热门文章

  1. SpringBoot学习笔记(9)----SpringBoot中使用关系型数据库以及事务处理
  2. NOIp2018滚粗记
  3. QSharedMemory共享内存实现进程间通讯(IPC)及禁止程序多开
  4. Selenium Webdriver ie 浏览器
  5. 写一个简单控制台启动的mcv服务
  6. 在Windows XP下,安装VS 2010 Express For Windows Phone .
  7. 如何停止运行在服务器的项目,怎么启动和停止服务器
  8. bit不是java基本类型吗_Java bit / byte 基本数据类型
  9. 给数据库字段增加前缀
  10. 微信小程序的userInfoReadyCallback理解