HDOJ Sudoku Killer(dfs)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1426
思路分析:该问题为数独问题,明显解是唯一的,所有采用dfs搜索效果更好;
在搜索时,可以通过3个数组来判断对于某个特定的数是否能够满足要求,即在每一行、每一列和每一个3X3的方块中只有唯一的1~9之间的数;
vis_r数组:如果vis_r[i][j] == 1表示在第i行中数字j已经存在,否则表示不存在;
vis_c数组:如果vis_c[i][j] == 1表示在第j列数字j已经存在,否则表示不存在;
对于3X3方块,按照从左到右,从上到下的顺序编号为0~9;
如果vis_k[i][j] == 1则表示第i号方块中数字j已经存在,否则表示不存在;
代码如下:
#include <cstdio>
#include <iostream>
using namespace std; const int MAX_N = 85;
const int MAX_M = 10;
int map[MAX_M][MAX_M];
int vis_r[MAX_M][MAX_M];
int vis_c[MAX_M][MAX_M];
int vis_k[MAX_M][MAX_M];
struct Node { int x, y; };
Node arr[MAX_N]; inline int ChunkNumber(int i, int j) { return i / 3 * 3 + j / 3; }
void Dfs(int deep, int k, int &find_ans)
{
if (deep == k)
{
find_ans = 1;
return;
}
else
{
int x = arr[deep].x;
int y = arr[deep].y;
int num_chunk = ChunkNumber(x, y); for (int i = 1; i <= 9; ++i)
{
if (!vis_r[x][i] && !vis_c[y][i] && !vis_k[num_chunk][i])
{ map[x][y] = i;
vis_r[x][i] = 1;
vis_c[y][i] = 1;
vis_k[num_chunk][i] = 1;
Dfs(deep + 1, k, find_ans);
if (find_ans) return;
vis_r[x][i] = 0;
vis_c[y][i] = 0;
vis_k[num_chunk][i] = 0;
map[x][y] = 0;
}
}
}
} int main()
{
char temp[MAX_M][MAX_M];
int k = 0, find_ans = 0;
int flag = 0; while (scanf("%s", &temp[0][0]) != EOF)
{
k = find_ans = 0;
for (int j = 1; j < 9; ++j)
scanf("%s", &temp[0][j]);
for (int i = 1; i < 9; ++i)
for (int j = 0; j < 9; ++j)
scanf("%s", &temp[i][j]); memset(vis_r, 0, sizeof(vis_r));
memset(vis_c, 0, sizeof(vis_c));
memset(vis_k, 0, sizeof(vis_k));
for (int i = 0; i < 9; ++i)
{
for (int j = 0; j < 9; ++j)
{
if (temp[i][j] == '?')
{
map[i][j] = 0;
arr[k].x = i;
arr[k].y = j;
k++;
}
else
{
int num = 0; num = map[i][j] = temp[i][j] - '0';
vis_r[i][num] = 1;
vis_c[j][num] = 1;
vis_k[ChunkNumber(i, j)][num] = 1;
}
}
}
Dfs(0, k, find_ans); if (flag)
printf("\n");
else
flag = 1;
for (int i = 0; i < 9; ++i)
for (int j = 0; j < 9; ++j)
{
if (j != 8)
printf("%c ", map[i][j] + '0');
else
printf("%c\n", map[i][j] + '0');
}
}
return 0;
}
HDOJ Sudoku Killer(dfs)的更多相关文章
- hdu 1426 Sudoku Killer (dfs)
Sudoku Killer Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Tot ...
- HUD 1426 Sudoku Killer (DFS)
链接 : Here! 思路 : 记录下所有 "?" , 出现的位置, 然后 $DFS$ 一下, 对于每个位置来说都可以填充 $9$ 种数值, 然后对于判断填充是否合法需要三个标记数 ...
- HDU1426 Sudoku Killer(DFS暴力) 2016-07-24 14:56 65人阅读 评论(0) 收藏
Sudoku Killer Problem Description 自从2006年3月10日至11日的首届数独世界锦标赛以后,数独这项游戏越来越受到人们的喜爱和重视. 据说,在2008北京奥运会上,会 ...
- hdu 1426:Sudoku Killer(DFS深搜,进阶题目,求数独的解)
Sudoku Killer Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Tot ...
- HDU 1426 Sudoku Killer(dfs 解数独)
传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1426 Sudoku Killer Time Limit: 2000/1000 MS (Java/Oth ...
- P - Sudoku Killer HDU - 1426(dfs + map统计数据)
P - Sudoku Killer HDU - 1426 自从2006年3月10日至11日的首届数独世界锦标赛以后,数独这项游戏越来越受到人们的喜爱和重视. 据说,在2008北京奥运会上,会将数独列为 ...
- hdu1426 Sudoku Killer
Sudoku Killer Time Limit : 2000/1000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other) Total ...
- Sudoku Killer
Problem Description 自从2006年3月10日至11日的首届数独世界锦标赛以后,数独这项游戏越来越受到人们的喜爱和重视. 据说,在2008北京奥运会上,会将数独列为一个单独的项目进行 ...
- Steam 游戏 《Sudoku Universe(数独宇宙)》、《Sudoku Killer(数独杀手)》、《Sudoku Jigsaw(数独拼图)》数字位置解析 ---------C# 数独程序解析(2020年寒假小目标11)
日期:2020.02.11 博客期:151 星期二 今天,准备肝一个 C# 的数独读写工具(汇编语言也在努力学习命令方法中...),这三个游戏我早就买下了,一直放在 Steam 库里积灰,看着它的成就 ...
随机推荐
- ##DAY14——StoryBoard
•iOS下可视化编程分为两种⽅式:xib和storyboard. •在使用xib和storyboard创建GUI过程中,以XML文件格式 存储在Xcode中,编译时生成nib的二进制文件.在运行时, ...
- LineCalc,一个基于Lex&Yacc的简单行计算工具
LineCalc是基于Lex&Yacc的一个简单的行计算工具,支持常见的运算符和部分POSIX中定义于math.h中的数学函数:同时,LineCalc还提供了一个简单的错误处理模块,能检测公式 ...
- 数组序列的capacity及size函数
#include<iostream>#include<vector>using namespace std;int main(){ vector<int> i ...
- BZOJ 2252: [2010Beijing wc]矩阵距离
题目 2252: [2010Beijing wc]矩阵距离 Time Limit: 10 Sec Memory Limit: 256 MB Description 假设我们有矩阵,其元素值非零即1 ...
- openStack centos6.4
http://repos.fedorapeople.org/repos/openstack/openstack-icehouse/epel-6/repodata/repomd.xml: [Errno ...
- Lua环境配置 windows + VS
环境搭建: 首先从 http://www.lua.org/ftp/下载lua 源码, 我选择的是lua-5.1.5.tar.gz 我的开发环境是Win7+ VS2010 打开VS2010新建一个工程L ...
- Linux进程间通信总结
刚请完婚假,请假期间做了些技术总结,其中一个就是Linux进程间通信方式的总结. Linux提供了多种进程间通信的方式,列举如下: PIPE(管道) FIFO(先进先出,也称为有名管道) domain ...
- c++中string::function集合
string append() 1.直接添加另一个完整的字符串: str1.append(str2); 2.添加另一个字符串的某一段字串: str1.append(str2, 11, 7); ...
- 在 win 10 中使用sql 2012 附加低版本数据失败的解决办法。
随着win 10 的发布,我也尝试把自己的笔记本升级下,体验win10,由于自己电脑好长时间没有管理过,东西比较乱,一激动就格式了硬盘.但是所有的资料都丢失了,不过我都提前备份到网盘上.好了,废话不多 ...
- SQL Server索引进阶:第七级,过滤的索引
原文地址: Stairway to SQL Server Indexes: Level 7,Filtered Indexes 本文是SQL Server索引进阶系列(Stairway to SQL S ...