poj 2676 数独问题 dfs
题意:完成数独程序,数独要求每行每列且每个3*3矩阵都必须是1~9的数字组成。
思路:dfs
- 用row[i][n] 记录第i行n存在 用col[j][n] 记录第j列n存在 grid[k][n] 记录第k个3*3中的n存在
- 遍历的时候,先把列遍历完然后在遍历行
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的更多相关文章
- 随手练——POJ - 2676 数独 (回溯法)
POJ - 2676 : http://poj.org/problem?id=2676: 解题思想 (大力出奇迹): 1. 依次在空格里面填上“1~9”,并检查这个数字是否合法(其所在的行.列,以及3 ...
- POJ 2676 数独(DFS)
Sudoku Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 21612 Accepted: 10274 Specia ...
- POJ 2676 数独+dfs深搜
数独 #include "cstdio" #include "cstring" #include "cstdlib" #include &q ...
- POJ 2676 Sudoku (DFS)
Sudoku Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 11694 Accepted: 5812 Special ...
- ACM : POJ 2676 SudoKu DFS - 数独
SudoKu Time Limit:2000MS Memory Limit:65536KB 64bit IO Format:%lld & %llu POJ 2676 Descr ...
- 深搜+回溯 POJ 2676 Sudoku
POJ 2676 Sudoku Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 17627 Accepted: 8538 ...
- POJ 1321 棋盘问题 --- DFS
POJ 1321 题目大意:给定一棋盘,在其棋盘区域放置棋子,需保证每行每列都只有一颗棋子. (注意 .不可放 #可放) 解题思路:利用DFS,从第一行开始依次往下遍历,列是否已经放置棋子用一个数组标 ...
- POJ.3321 Apple Tree ( DFS序 线段树 单点更新 区间求和)
POJ.3321 Apple Tree ( DFS序 线段树 单点更新 区间求和) 题意分析 卡卡屋前有一株苹果树,每年秋天,树上长了许多苹果.卡卡很喜欢苹果.树上有N个节点,卡卡给他们编号1到N,根 ...
- POJ 2676 Sudoku (数独 DFS)
Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 14368 Accepted: 7102 Special Judg ...
随机推荐
- (转)网站DDOS攻击防护实战老男孩经验心得分享
网站DDOS攻击防护实战老男孩经验心得分享 原文:http://blog.51cto.com/oldboy/845349
- Spark Mllib里如何将数据取消暂存在内存中(图文详解)
不多说,直接上干货! 具体,见 Hadoop+Spark大数据巨量分析与机器学习整合开发实战的第18章 决策树回归分类Bike Sharing数据集
- Hadoop数据管理
本节主要从三方面介绍Hadoop数据管理:分布式文件系统HDFS.分部式数据库HBase和数据仓库工具Hive. 1. HDFS的数据管理 HDFS是分布式计算的存储基石,Hadoop分布式文件系统和 ...
- 《从0到1学习Flink》—— Flink 配置文件详解
前面文章我们已经知道 Flink 是什么东西了,安装好 Flink 后,我们再来看下安装路径下的配置文件吧. 安装目录下主要有 flink-conf.yaml 配置.日志的配置文件.zk 配置.Fli ...
- SQL Server事务的四种隔离级别
在SQL标准中定义了四种隔离级别,每一种级别都规定了一个事务中所做的修改,哪些是在事务内和事务间可见的,哪些是不可见的.较低级别的隔离通常可以执行更高的并发,系统的开销也更低. 1.未提交读(Read ...
- mongodb Limit操作
Limit() 方法 要限制 MongoDB 中的记录,需要使用 limit() 方法. limit() 方法接受一个数字型的参数,这是要显示的文档数. 语法: limit() 方法的基本语法如下 & ...
- ArcServer10.1系列产品之ArcGIS Web Adaptor (IIS)
1.关于 ArcGIS Web Adaptor 通过 ArcGIS Web Adaptor,可以将 ArcGIS for Server 与您现有的 Web 服务器进行集成.ArcGIS Web Ada ...
- PHP判断两个矩形是否相交
<?php $s = is_rect_intersect(1,2,1,2,4,5,0,3); var_dump($s); /* 如果两个矩形相交,那么矩形A B的中心点和矩形的边长是有一定关系的 ...
- Linux 系统挂载阿里云数据盘
适用系统:Linux(Redhat , CentOS,Debian,Ubuntu) * Linux的云服务器数据盘未做分区和格式化,可以根据以下步骤进行分区以及格式化操作. 下面的操作将会把数据盘划 ...
- javaSe-常用的类之Calender
Calendar是java中常用的类,比data类使用更加方便,更能更加强大,好吧多的不用你说了,直接上代码 import java.util.Calendar;//需要引进的包 public cla ...