题意:完成数独程序,数独要求每行每列且每个3*3矩阵都必须是1~9的数字组成。

思路:dfs

  1. 用row[i][n] 记录第i行n存在  用col[j][n] 记录第j列n存在 grid[k][n] 记录第k个3*3中的n存在
  2. 遍历的时候,先把列遍历完然后在遍历行
if (map[r][c])
{
if (c == ) flag = dfs(r + , );
else flag = dfs(r, c + );
return flag;
}

现在推

第一个矩阵为  0,0 0,1 0,2              第二个矩阵为   0,3 0,4 0,5

1,0 1,1 1,2                                       1,3  1,4 1,5

2,0 2,1 2,2                                       2,3 2,4 2,5

如果直接 (r+c)/3有些不符合,说明应该把 r c拆开来看 所以推出 r/3*3+c/3

解决问题的代码:

#include<cstdio>
#include<cstring>
using namespace std;
const int maxn = ;
int map[maxn][maxn];
bool row[maxn][maxn];
bool col[maxn][maxn];
bool grid[maxn][maxn];
bool dfs(int r, int c)
{
if (r == ) return true;//构造完毕
bool flag = false;
if (map[r][c])
{
if (c == ) flag = dfs(r + , );
else flag = dfs(r, c + );
return flag;
}
int k = (r / ) * + c / ;
for (int i = ; i <= ; i++)if (!row[r][i] && !col[c][i] && !grid[k][i])
{
row[r][i] = col[c][i] = grid[k][i] = true;
map[r][c] = i;
if (c == ) flag = dfs(r + , );
else flag = dfs(r, c + );
if (flag) return true;
map[r][c] = ;
row[r][i] = col[c][i] = grid[k][i] = false;
}
return false;
}
int main()
{
int T; scanf("%d", &T);
while (T--)
{
memset(row, , sizeof(row));
memset(col, , sizeof(col));
memset(grid, , sizeof(grid));
for (int i = ; i<; i++)
for (int j = ; j<; j++)
{
char x;
scanf(" %c", &x);
map[i][j] = x - '';
if (map[i][j])
{
row[i][map[i][j]] = true;
col[j][map[i][j]] = true;
int k = (i / ) * + j / ;
grid[k][map[i][j]] = true;
}
}
dfs(, );
for (int i = ; i<; i++)
{
for (int j = ; j<; j++)
printf("%d", map[i][j]);
printf("\n");
}
}
return ;
}

poj 2676 数独问题 dfs的更多相关文章

  1. 随手练——POJ - 2676 数独 (回溯法)

    POJ - 2676 : http://poj.org/problem?id=2676: 解题思想 (大力出奇迹): 1. 依次在空格里面填上“1~9”,并检查这个数字是否合法(其所在的行.列,以及3 ...

  2. POJ 2676 数独(DFS)

    Sudoku Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 21612   Accepted: 10274   Specia ...

  3. POJ 2676 数独+dfs深搜

    数独 #include "cstdio" #include "cstring" #include "cstdlib" #include &q ...

  4. POJ 2676 Sudoku (DFS)

    Sudoku Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 11694   Accepted: 5812   Special ...

  5. ACM : POJ 2676 SudoKu DFS - 数独

    SudoKu Time Limit:2000MS     Memory Limit:65536KB     64bit IO Format:%lld & %llu POJ 2676 Descr ...

  6. 深搜+回溯 POJ 2676 Sudoku

    POJ 2676 Sudoku Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 17627   Accepted: 8538 ...

  7. POJ 1321 棋盘问题 --- DFS

    POJ 1321 题目大意:给定一棋盘,在其棋盘区域放置棋子,需保证每行每列都只有一颗棋子. (注意 .不可放 #可放) 解题思路:利用DFS,从第一行开始依次往下遍历,列是否已经放置棋子用一个数组标 ...

  8. POJ.3321 Apple Tree ( DFS序 线段树 单点更新 区间求和)

    POJ.3321 Apple Tree ( DFS序 线段树 单点更新 区间求和) 题意分析 卡卡屋前有一株苹果树,每年秋天,树上长了许多苹果.卡卡很喜欢苹果.树上有N个节点,卡卡给他们编号1到N,根 ...

  9. POJ 2676 Sudoku (数独 DFS)

      Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 14368   Accepted: 7102   Special Judg ...

随机推荐

  1. (转)网站DDOS攻击防护实战老男孩经验心得分享

    网站DDOS攻击防护实战老男孩经验心得分享 原文:http://blog.51cto.com/oldboy/845349

  2. Spark Mllib里如何将数据取消暂存在内存中(图文详解)

    不多说,直接上干货! 具体,见 Hadoop+Spark大数据巨量分析与机器学习整合开发实战的第18章 决策树回归分类Bike Sharing数据集

  3. Hadoop数据管理

    本节主要从三方面介绍Hadoop数据管理:分布式文件系统HDFS.分部式数据库HBase和数据仓库工具Hive. 1. HDFS的数据管理 HDFS是分布式计算的存储基石,Hadoop分布式文件系统和 ...

  4. 《从0到1学习Flink》—— Flink 配置文件详解

    前面文章我们已经知道 Flink 是什么东西了,安装好 Flink 后,我们再来看下安装路径下的配置文件吧. 安装目录下主要有 flink-conf.yaml 配置.日志的配置文件.zk 配置.Fli ...

  5. SQL Server事务的四种隔离级别

    在SQL标准中定义了四种隔离级别,每一种级别都规定了一个事务中所做的修改,哪些是在事务内和事务间可见的,哪些是不可见的.较低级别的隔离通常可以执行更高的并发,系统的开销也更低. 1.未提交读(Read ...

  6. mongodb Limit操作

    Limit() 方法 要限制 MongoDB 中的记录,需要使用 limit() 方法. limit() 方法接受一个数字型的参数,这是要显示的文档数. 语法: limit() 方法的基本语法如下 & ...

  7. ArcServer10.1系列产品之ArcGIS Web Adaptor (IIS)

    1.关于 ArcGIS Web Adaptor 通过 ArcGIS Web Adaptor,可以将 ArcGIS for Server 与您现有的 Web 服务器进行集成.ArcGIS Web Ada ...

  8. PHP判断两个矩形是否相交

    <?php $s = is_rect_intersect(1,2,1,2,4,5,0,3); var_dump($s); /* 如果两个矩形相交,那么矩形A B的中心点和矩形的边长是有一定关系的 ...

  9. Linux 系统挂载阿里云数据盘

    适用系统:Linux(Redhat , CentOS,Debian,Ubuntu) *  Linux的云服务器数据盘未做分区和格式化,可以根据以下步骤进行分区以及格式化操作. 下面的操作将会把数据盘划 ...

  10. javaSe-常用的类之Calender

    Calendar是java中常用的类,比data类使用更加方便,更能更加强大,好吧多的不用你说了,直接上代码 import java.util.Calendar;//需要引进的包 public cla ...