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 库里积灰,看着它的成就 ...
随机推荐
- 软件开发常用Linux命令
解压缩 tar -zxvf xxx.tar.gz 文件显示及查找常用于分析log //显示file中包含aaa的行 cat <file>|grep aaa 查看cpu memory基本信息 ...
- ASP.NET MVC 音乐商店 - 目录
这一个系列的内容来自微软的音乐商店 Music Store, 这是项目在 Codeplex 上的地址:http://mvcmusicstore.codeplex.com/. 这个项目使用 ASP.NE ...
- apache+mysql+php环境的手动搭建
一.搭建Apache Http Server 官方下载地址:http://www.apachehaus.com/cgi-bin/download.plx 搭建环境:win10 64位 WIN10 64 ...
- C++ try catch 捕获空指针异常,数组越界异常
#include <exception> #include <iostream> using namespace std; /************************* ...
- Chrome NativeClient创建 (转)
Chrome NativeClient创建 该demo目标是让chrome扩展启动本地exe 1创建一个名叫nativeMsgDemo的控制台程序 #include <Windows.h> ...
- Hadoop学习之shuffle过程
转自:http://langyu.iteye.com/blog/992916,多谢分享,学习Hadopp性能调优的可以多关注一下 Shuffle过程是MapReduce的核心,也被称为奇迹发生的地方, ...
- Python学习笔记 (1) :python简介、工具、编码及基础运算
学习背景: 精通一门编程语言并编写出自己喜欢的程序是我多年的梦想,一定要找时间实现.此时想起了高中时的我对编程的兴趣十分浓厚,父母给自己购买了学习机插卡式的,只能敲basic代码,同时学校有386计算 ...
- Groovy中那些神奇注解之InheritConstructors
上一篇:Groovy中那些神奇注解之ToString 写完ToString,本来想今天就写到这了,突然觉得InheritConstructors注解实在也是个神器,写起来也没多少字,还是写了吧. In ...
- HDU 3507 Print Article(CDQ分治+分治DP)
[题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=3507 [题目大意] 将长度为n的数列分段,最小化每段和的平方和. [题解] 根据题目很容易得到dp ...
- hdu4491 Windmill Animation(计算几何)
Windmill Animation Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Other ...