题目链接:点击查看

题目大意:解数独,具体规则是,在一个9*9的区域内填充1~9的数字,要求:

  1. 每列不许有重复数字
  2. 每行不许有重复数字
  3. 每个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)相关推荐

  1. Poj 2676 Sudoku[dfs]

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

  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. vue 设置输入法隐藏_原来iPhone自带的输入法这么强大?好多人都不知道其中的隐藏功能...
  2. hadoop cdh 4.5的安装配置
  3. 2012 winter training @HIT Day 2 解题报告
  4. Linux源码安装mysql 5.6.12(cmake编译)
  5. Linux学习笔记——gzip命令
  6. jq之mouseup
  7. 多种方法列出集合中的所有子集(Python和Java实现)
  8. 解决:modal中datePicker 选中时,会触发modal的hidden.bs.modal事件
  9. DB_RUNRECOVERY: Fatal error, run database recovery StackTrace问题的解决办法
  10. nmake命令行编译Qt项目
  11. Opencv速成笔记--图像处理1
  12. Vue 九宫格抽奖实现
  13. Java简单猜数字游戏
  14. 【高等代数】行列式的定义和性质
  15. VMware虚拟机屏幕大小(屏幕分辨率)调整
  16. 生信漫谈如何做出美美的多序列比对图
  17. 有一个地方,叫做稻城
  18. 使用Squid架设代理服务器实现局域网共享上网
  19. python程序中如何合理处理[WinError 5]拒绝访问的错误
  20. 设计原则(5)-迪米特法则

热门文章

  1. 序列化的高阶认识-简单认识一下 Java 原生序列化
  2. 密码登录模式流程分析
  3. SpringBoot高级-任务-邮件任务
  4. Redis分布式快速入门
  5. 云服务器 web网站吗,web云服务器免费的吗
  6. 东莞电子计算机学校,东莞市电子科技学校
  7. mysql设置字段为空字符串_mysql数据类型字段插入空字符串自动填充为0报错
  8. java调用rocketmq_java操作RocketMQ
  9. WIN10安装ubuntu全过程
  10. DOM基本操作(二:对节点的操作)