POJ 2676 Sudoku (数独求解器 DFS)
题目链接
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)相关推荐
- POJ 2676 Sudoku 数独
点击打开链接 Sudoku Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 12360 Accepted: 6168 ...
- POJ 2676 Sudoku【DancingLinks,数独】
http://poj.org/problem?id=2676 POJ 2676 Sudoku 也是求解规模为9*9的数独问题,与POJ 3074 Sudoku相同的问题,只是修改了输入输出格式而已.. ...
- C++数独求解器与生成器
前几天笔者外出培训,刚刚学习了深度优先搜索,突然想到了数独的求解其实也可以用深搜实现,遂写了数独求解器与生成器. 1 数独求解器 1.1 预备 一开始,当然是头文件~ #include <ios ...
- MATLAB 自动数独求解器(导入图片自动求解)
做了一个导入图片自动求解数独的软件,不过由于目前是通过最小二乘法匹配数字的,所以导入图片中的数字最好不要是手写的..,图片大概就像这样: 使用效果: 完整代码: function sudokuApp ...
- 编程之美之数独求解器的C++实现方法
编程之美的第一章的第15节,讲的是构造数独,一开始拿到这个问题的确没有思路, 不过看了书中的介绍之后, 发现原来这个的求解思路和N皇后问题是一致的, 但是不知道为啥,反正一开始确实没有想到这个回溯法, ...
- 好用的z3数独求解器
github 上发现一个好用 用z3 编写的数独求解器 传送门: https://github.com/dferri/z3-skyscrapers Generate a skyscrapers puz ...
- 数独输出Java_java – 使用回溯的数独求解器
我最近一直致力于回溯数独求解算法,目前我想询问我应该如何将我的solve()方法从void更改为boolean. 我正在使用一个非常简单的回溯算法,它目前工作正常,但我宁愿有一个布尔值而不是一个空格, ...
- Poj 2676 Sudoku[dfs]
题目大意: 九宫格问题,也有人叫数独问题 把一个9行9列的网格,再细分为9个3*3的子网格,要求每行.每列.每个子网格内都只能使用一次1~9中的一个数字,即每行.每列.每个子网格内都不允许出现相同的数 ...
- POJ - 2676 Sudoku(dfs)
题目链接:点击查看 题目大意:解数独,具体规则是,在一个9*9的区域内填充1~9的数字,要求: 每列不许有重复数字 每行不许有重复数字 每个3*3的九宫格内不许有重复数字 题目分析:因为至多只有81个 ...
最新文章
- Java基础学习总结(15)——java读取properties文件总结
- 在Fedora 14上安装Sun JDK 6 (转载)
- python难度大吗_python需要学多久?自学两年也很难达到企业标准
- 获取bootgrid选中行数据_Easyui 取得选中行数据_EasyUI 教程
- iOS开发之将base64位编码的字符串转换为图片,data转图片,图片转data
- win10下Miracast无线投屏使用教程及异常解决方案(超详细)
- CAD学习笔记中级课【参数化】
- Convert Binary Search Tree to Sorted Doubly Linked List
- Android OpenGL探索之纯色背景绘制
- 社交礼仪之握手礼仪(转)
- 贷款买房怎么做才划算?贷款买房注意事项
- 【数据库设计】学籍管理的数据库系统
- 四川绵阳成立大中华区首个 IBM大数据分析竞争力中心
- Class::DBI模块简介
- 华为云计算机访问手机软件,手机也能当电脑使用?华为黑科技:手机云电脑
- 使用Atmel ICE通过SWD接口调试Arduino MKR-WiFi-1010开发板
- modbustcp测试工具怎么用_年轻人不讲武德不仅白piao接口测试知识还白piao接口测试工具会员...
- 数据库函数依赖与候选码求解
- [报错]RuntimeError: expected scalar type Double but found Float(torch)
- oracle数据库的练习题,《Oracle数据库应用》练习题及答案