NYOJ 722 数独 【DFS】+【预处理】
数独
- 描写叙述
-
数独是一种运用纸、笔进行演算的逻辑游戏。玩家须要依据9×9盘面上的已知数字,推理出全部剩余空格的数字,并满足每一行、每一列、每个3*3宫内的数字均含1-9,不反复。 每一道合格的数独谜题都有且仅有唯一答案,推理方法也以此为基础,不论什么无解或多解的题目都是不合格的。
有一天hrdv碰到了一道号称是世界上最难的数独的题目。作为一名合格的程序猿,哪能随随便便向困难低头,于是他决定编个程序来解决它。。

- 输入
- 第一行有一个数n(0< n <100),表示有n组測试数据,每组測试数据是由一个9*9的九宫格构成,0表示相应的格子为空
- 输出
- 输出一个9*9的九宫格,为这个数独的答案
- 例子输入
-
1
0 0 5 3 0 0 0 0 0
8 0 0 0 0 0 0 2 0
0 7 0 0 1 0 5 0 0
4 0 0 0 0 5 3 0 0
0 1 0 0 7 0 0 0 6
0 0 3 2 0 0 0 8 0
0 6 0 5 0 0 0 0 9
0 0 4 0 0 0 0 3 0
0 0 0 0 0 9 7 0 0 - 例子输出
-
1 4 5 3 2 7 6 9 8
8 3 9 6 5 4 1 2 7
6 7 2 9 1 8 5 4 3
4 9 6 1 8 5 3 7 2
2 1 8 4 7 3 9 5 6
7 5 3 2 9 6 4 8 1
3 6 7 5 4 2 8 1 9
9 8 4 7 6 1 2 3 5
5 2 1 8 3 9 7 6 4
非常经典的一道搜索题。開始深搜的时候每次都遍历棋盘,结果总是出现莫名其妙的问题,然后预处理了一下,最后就过了。
#include <stdio.h>
#include <string.h>
int arr[10][10], count;
bool visrow[10][10], viscol[10][10], vissqu[10][10], ok;
struct Node{
int x, y;
} tar[82];int getsqunum(int i, int j){
return i / 3 * 3 + j / 3; //the charm of math
}void print(){
for(int i = 0; i < 9; ++i)
for(int j = 0; j < 9; ++j)
if(j != 8) printf("%d ", arr[i][j]);
else printf("%d\n", arr[i][j]);
}bool check(int i, int j, int k){
int t = getsqunum(i, j);
if(visrow[i][k] || viscol[j][k] || vissqu[t][k]) return 0;
return 1;
}void DFS(int k){
if(k == count){ ok = 1; print(); return; }
int t = getsqunum(tar[k].x, tar[k].y);
for(int i = 1; i < 10; ++i){
if(check(tar[k].x, tar[k].y, i)){
visrow[tar[k].x][i] = 1;
viscol[tar[k].y][i] = 1;
vissqu[t][i] = 1;
arr[tar[k].x][tar[k].y] = i;DFS(k + 1);
if(ok) return;arr[tar[k].x][tar[k].y] = 0;
visrow[tar[k].x][i] = 0;
viscol[tar[k].y][i] = 0;
vissqu[t][i] = 0;
}
}
}int main(){
int n; scanf("%d", &n);
while(n--){
memset(viscol, 0, sizeof(viscol));
memset(visrow, 0, sizeof(visrow));
memset(vissqu, 0, sizeof(vissqu));
count = 0;
for(int i = 0; i < 9; ++i)
for(int j = 0; j < 9; ++j){
scanf(&quo
NYOJ 722 数独 【DFS】+【预处理】的更多相关文章
- P1074 靶形数独 dfs+预处理
https://www.luogu.org/problemnew/show/P1074 显然是dfs 而且没有什么剪枝记忆化之类的 但是预处理比较麻烦 我用三个二维数组存状态:visx[x][i]代表 ...
- NYOJ 722 数独
数独 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 数独是一种运用纸.笔进行演算的逻辑游戏.玩家需要根据9×9盘面上的已知数字,推理出所有剩余空格的数字,并满足每一 ...
- codeforces div2_603 F. Economic Difficulties(树dfs预处理+dp)
题目连接:http://codeforces.com/contest/1263/problem/F 题意:有n个设备,上和下分别连接着一颗树,上下两棵树每棵树的叶子节点连接一个设备,两棵树的根节点都是 ...
- NYOJ 数独 DFS
数独 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 数独是一种运用纸.笔进行演算的逻辑游戏.玩家需要根据9×9盘面上的已知数字,推理出所有剩余空格的数字,并满足每一 ...
- 靶形数独 (dfs+预处理+状态压缩)
#2591. 「NOIP2009」靶形数独 [题目描述] 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们 ...
- P1074 靶形数独 dfs回溯法
题目描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z 博士请教,Z 博士拿出了他最近发明的“靶 ...
- 洛谷1074 靶状数独dfs 排序、记录、搜索
题目网址:https://www.luogu.com.cn/problem/P1074 大意就是在一个9*9的数独中填数,要求行列宫都是九个互不相同的数字,给定一定的得分机制,要求求解最大得分.思路大 ...
- NOIP2009靶形数独[DFS 优化]
描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z博士请教,Z 博士拿出了他最近发明的“靶形数独 ...
- BZOJ-1087 互不侵犯King 状压DP+DFS预处理
1087: [SCOI2005]互不侵犯King Time Limit: 10 Sec Memory Limit: 162 MB Submit: 2337 Solved: 1366 [Submit][ ...
随机推荐
- SDOJ 3696 Tree
描述 给你一个无向带权连通图,每条边是黑色或白色.让你求一棵最小权的恰好有need条白色边的生成树. 题目保证有解. 输入 第一行V,E,need分别表示点数,边数和需要的白色边数. 接下来E行 每行 ...
- [python学习篇][廖雪峰][2][高级函数] map 和reduce
我们先看map.map()函数接收两个参数,一个是函数,一个是序列,map将传入的函数依次作用到序列的每个元素,并把结果作为新的list返回. 举例说明,比如我们有一个函数f(x)=x2,要把这个函数 ...
- Map容器——HashMap及常用API,及put,get方法解析,哈希码的产生和使用
Map接口 ① 映射(map)是一个存储键/值对的对象.给定一个键,可以查询到它的值,键和值都是对象; ② 键必须是唯一的,值可以重复; ③ 有些映射可以接收null键和null值,而有的 ...
- .net SignalR 聊天室
代码地址:https://gitee.com/srnsrn/netSignalr.git 运行项目打开多个页面 私密聊天
- mycat 优化
版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/u014180504/article/details/76595247show @@datanode; ...
- Linux硬件资源管理与外设设备使用、系统运行机制及用户管理
Linux硬件资源管理 PCI设备 显卡 $>>dmesg |grep -i vga[ 0.000000] Console: colour VG ...
- 建立RSA协商加密的安全信道
在基于TCP长连接的CS链路中,如何保证数据流的安全性是开发者最关注的问题之一.本文深入浅出的给大家介绍一下在TCP连接中,使用RSA协商加密的方式,建立一个安全加密的通信链路,保证数据传输的安全性. ...
- 【Luogu】P3332K大数查询(树套树)
题目链接 这题我费尽心思不用标记永久化终于卡过去了qwq 权值线段树下面套一个区间线段树.然后乱搞搞即可. // luogu-judger-enable-o2 #include<cstdio&g ...
- HDU——1272小希的迷宫(并查集+拓扑排序)
小希的迷宫 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Subm ...
- [luoguP2763] 试题库问题(最大流)
传送门 每个类别和它所有的试题连一条权值为1的边. 增加一个超级源点s,s和每个类别连一条权值为选当前类别数量的边. 增加一个超级汇点t,每个试题和t连一条权值为1的边. 求最大流即可. ——代码 # ...