题目链接

POJ2676

题目大意

输入n个数独,空格用0表示,填数独(符合的一种方案即可)。

分析

类似于八皇后的简单搜索题,用DFS回溯法求解。
将空格的位置都记录下来,1个1个填下去,填不下去就清空换其他数字。
关键进行可行性剪枝:
row[i][j]:记录第i行数字j是否可填
column[i][j]:记录第i列数字j是否可填
block[i][j]:记录第i个九宫格数字j是否可填

代码

#include <iostream>
#include <cstring>
using namespace std;
bool row[10][10],column[10][10],block[10][10],flag;
int s[10][10],cnt;
struct
{int x,y;
}p[730]; //记录空格的坐标
int num(int x,int y) //返回(x,y)属于第几个九宫格
{if (1<=x&&x<=3&&1<=y&&y<=3) return 1;if (1<=x&&x<=3&&4<=y&&y<=6) return 2;if (1<=x&&x<=3&&7<=y&&y<=9) return 3;if (4<=x&&x<=6&&1<=y&&y<=3) return 4;if (4<=x&&x<=6&&4<=y&&y<=6) return 5;if (4<=x&&x<=6&&7<=y&&y<=9) return 6;if (7<=x&&x<=9&&1<=y&&y<=3) return 7;if (7<=x&&x<=9&&4<=y&&y<=6) return 8;if (7<=x&&x<=9&&7<=y&&y<=9) return 9;
}
void Init()
{cnt=0;flag=false;memset(row,true,sizeof(row));memset(column,true,sizeof(column));memset(block,true,sizeof(block));
}
void Print()
{for (int i=1;i<=9;i++){for (int j=1;j<=9;j++)cout<<s[i][j];cout<<endl;}
}
void dfs(int t)
{if (t==cnt+1) //当所有空格都填完了{flag=true;//找到1个答案就不用搜索了Print();}if (flag) return;int x,y;x=p[t].x;y=p[t].y;for (int i=1;i<=9;i++)if (row[x][i]&&column[y][i]&&block[num(x,y)][i]){s[x][y]=i;row[x][i]=column[y][i]=block[num(x,y)][i]=false;dfs(t+1);if (flag) return;s[x][y]=0;row[x][i]=column[y][i]=block[num(x,y)][i]=true;//回溯,清空标记}return;
}
int main()
{int test,i,j;char ch;cin>>test;while (test--){Init();for (i=1;i<=9;i++)for (j=1;j<=9;j++){cin>>ch;s[i][j]=ch-'0';if (!s[i][j]){p[++cnt].x=i;p[cnt].y=j;}else{row[i][s[i][j]]=false;column[j][s[i][j]]=false;block[num(i,j)][s[i][j]]=false;}}dfs(1);}return 0;
}

POJ 2676 Sudoku (数独求解器 DFS)相关推荐

  1. POJ 2676 Sudoku 数独

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

  2. POJ 2676 Sudoku【DancingLinks,数独】

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

  3. C++数独求解器与生成器

    前几天笔者外出培训,刚刚学习了深度优先搜索,突然想到了数独的求解其实也可以用深搜实现,遂写了数独求解器与生成器. 1 数独求解器 1.1 预备 一开始,当然是头文件~ #include <ios ...

  4. MATLAB 自动数独求解器(导入图片自动求解)

    做了一个导入图片自动求解数独的软件,不过由于目前是通过最小二乘法匹配数字的,所以导入图片中的数字最好不要是手写的..,图片大概就像这样: 使用效果: 完整代码: function sudokuApp ...

  5. 编程之美之数独求解器的C++实现方法

    编程之美的第一章的第15节,讲的是构造数独,一开始拿到这个问题的确没有思路, 不过看了书中的介绍之后, 发现原来这个的求解思路和N皇后问题是一致的, 但是不知道为啥,反正一开始确实没有想到这个回溯法, ...

  6. 好用的z3数独求解器

    github 上发现一个好用 用z3 编写的数独求解器 传送门: https://github.com/dferri/z3-skyscrapers Generate a skyscrapers puz ...

  7. 数独输出Java_java – 使用回溯的数独求解器

    我最近一直致力于回溯数独求解算法,目前我想询问我应该如何将我的solve()方法从void更改为boolean. 我正在使用一个非常简单的回溯算法,它目前工作正常,但我宁愿有一个布尔值而不是一个空格, ...

  8. Poj 2676 Sudoku[dfs]

    题目大意: 九宫格问题,也有人叫数独问题 把一个9行9列的网格,再细分为9个3*3的子网格,要求每行.每列.每个子网格内都只能使用一次1~9中的一个数字,即每行.每列.每个子网格内都不允许出现相同的数 ...

  9. POJ - 2676 Sudoku(dfs)

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

最新文章

  1. Java基础学习总结(15)——java读取properties文件总结
  2. 在Fedora 14上安装Sun JDK 6 (转载)
  3. python难度大吗_python需要学多久?自学两年也很难达到企业标准
  4. 获取bootgrid选中行数据_Easyui 取得选中行数据_EasyUI 教程
  5. iOS开发之将base64位编码的字符串转换为图片,data转图片,图片转data
  6. win10下Miracast无线投屏使用教程及异常解决方案(超详细)
  7. CAD学习笔记中级课【参数化】
  8. Convert Binary Search Tree to Sorted Doubly Linked List
  9. Android OpenGL探索之纯色背景绘制
  10. 社交礼仪之握手礼仪(转)
  11. 贷款买房怎么做才划算?贷款买房注意事项
  12. 【数据库设计】学籍管理的数据库系统
  13. 四川绵阳成立大中华区首个 IBM大数据分析竞争力中心
  14. Class::DBI模块简介
  15. 华为云计算机访问手机软件,手机也能当电脑使用?华为黑科技:手机云电脑
  16. 使用Atmel ICE通过SWD接口调试Arduino MKR-WiFi-1010开发板
  17. modbustcp测试工具怎么用_年轻人不讲武德不仅白piao接口测试知识还白piao接口测试工具会员...
  18. 数据库函数依赖与候选码求解
  19. [报错]RuntimeError: expected scalar type Double but found Float(torch)
  20. oracle数据库的练习题,《Oracle数据库应用》练习题及答案

热门文章

  1. win10上运行linux程序吗,Win10可以运行 Linux 的图形界面程序了
  2. 思维导图的分类 利用思维导图绘制学习知识方法介绍
  3. 为什么要升级BIOS呢?(1)
  4. welsh-powell
  5. python爬虫菜鸟教程-Python数据分析,学习路径拆解及资源推荐
  6. Mac上zip,rar,tar文件命令解压和压缩
  7. 一键电子书:最好用的电子书一键生成软件
  8. 《胡适文存》胡适的读书方法
  9. idea双击无反应,打不开的解决办法!
  10. android wifi 图标,android wifi信号强度与图标对应关系