POJ - 2676 Sudoku(dfs)
题目链接:点击查看
题目大意:解数独,具体规则是,在一个9*9的区域内填充1~9的数字,要求:
- 每列不许有重复数字
- 每行不许有重复数字
- 每个3*3的九宫格内不许有重复数字
题目分析:因为至多只有81个数,所以我们可以直接dfs,我们肯定是需要剪枝的,直接搜的话时间复杂度是呈指数级别上升的,因为每个方格有0~9共十种不同的情况,直接爆搜的话时间复杂度是,肯定顶不住,所以我们需要考虑该如何剪枝
其实剪枝的方法也不难,就是需要编写一个check函数,用来检查某个位置上放某个数字是否合适即可,因为数独规则的特殊性,导致种情况中符合情况的寥寥无几,所以我们可以及时回溯,将其变为简单dfs来写即可
代码:
#include<iostream>
#include<cstdio>
#include<string>
#include<ctime>
#include<cstring>
#include<algorithm>
#include<stack>
#include<queue>
#include<map>
#include<sstream>
using namespace std;typedef long long LL;const int inf=0x3f3f3f3f;const int N=9;int maze[N][N];bool check(int num,int val)//用来判断第num个数上放值val是否合适
{int x=num/9;int y=num%9;for(int i=0;i<N;i++)if(maze[x][i]==val||maze[i][y]==val)return false;int xx=x/3*3;int yy=y/3*3;for(int i=xx;i<xx+3;i++)for(int j=yy;j<yy+3;j++)if(maze[i][j]==val)return false;return true;
}bool dfs(int num)//这里的num用十进制储存的九进制,即0~80恰好可以转换为一个至多两位的九进制,用来表示x轴和y轴的坐标
{if(num==81)return true;int x=num/9;int y=num%9;if(maze[x][y]){if(dfs(num+1))return true;}else{for(int i=1;i<=9;i++){if(check(num,i)){maze[x][y]=i;if(dfs(num+1))return true;maze[x][y]=0;}}}return false;
}int main()
{
// freopen("input.txt","r",stdin);int w;cin>>w;while(w--){for(int i=0;i<N;i++)for(int j=0;j<N;j++)scanf("%1d",&maze[i][j]);dfs(0);for(int i=0;i<N;i++){for(int j=0;j<N;j++)printf("%d",maze[i][j]);printf("\n");}}return 0;
}
POJ - 2676 Sudoku(dfs)相关推荐
- Poj 2676 Sudoku[dfs]
题目大意: 九宫格问题,也有人叫数独问题 把一个9行9列的网格,再细分为9个3*3的子网格,要求每行.每列.每个子网格内都只能使用一次1~9中的一个数字,即每行.每列.每个子网格内都不允许出现相同的数 ...
- POJ 2676 Sudoku【DancingLinks,数独】
http://poj.org/problem?id=2676 POJ 2676 Sudoku 也是求解规模为9*9的数独问题,与POJ 3074 Sudoku相同的问题,只是修改了输入输出格式而已.. ...
- POJ 2676 Sudoku (数独求解器 DFS)
题目链接 POJ2676 题目大意 输入n个数独,空格用0表示,填数独(符合的一种方案即可). 分析 类似于八皇后的简单搜索题,用DFS回溯法求解. 将空格的位置都记录下来,1个1个填下去,填不下去就 ...
- POJ 2676 Sudoku 数独
点击打开链接 Sudoku Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 12360 Accepted: 6168 ...
- POJ - 2386 (dfs简单应用)
POJ - 2386 (dfs深度优先搜索) 题目正文: Due to recent rains, water has pooled in various places in Farmer John' ...
- 【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 ...
- POJ 2676/2918 数独(dfs)
思路:记录每行每列每一个宫已经出现的数字就可以.数据比較弱 另外POJ 3074 3076 必须用剪枝策略.但实现较麻烦,还是以后学了DLX再来做吧 //Accepted 160K 0MS #incl ...
- POJ 2386(DFS)
深度优先搜索属于图算法的一种,英文缩写为DFS即Depth First Search.其过程简要来说是对每一个可能的分支路径深入到不能再深入为止,而且每个节点只能访问一次. 举例说明之:下图是一个无向 ...
- TOJ 3287 Sudoku dfs
3287: Sudoku 描述 Sudoku is a very simple task. A square table with 9 rows and 9 columns is divided to ...
最新文章
- vue 设置输入法隐藏_原来iPhone自带的输入法这么强大?好多人都不知道其中的隐藏功能...
- hadoop cdh 4.5的安装配置
- 2012 winter training @HIT Day 2 解题报告
- Linux源码安装mysql 5.6.12(cmake编译)
- Linux学习笔记——gzip命令
- jq之mouseup
- 多种方法列出集合中的所有子集(Python和Java实现)
- 解决:modal中datePicker 选中时,会触发modal的hidden.bs.modal事件
- DB_RUNRECOVERY: Fatal error, run database recovery StackTrace问题的解决办法
- nmake命令行编译Qt项目
- Opencv速成笔记--图像处理1
- Vue 九宫格抽奖实现
- Java简单猜数字游戏
- 【高等代数】行列式的定义和性质
- VMware虚拟机屏幕大小(屏幕分辨率)调整
- 生信漫谈如何做出美美的多序列比对图
- 有一个地方,叫做稻城
- 使用Squid架设代理服务器实现局域网共享上网
- python程序中如何合理处理[WinError 5]拒绝访问的错误
- 设计原则(5)-迪米特法则