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 库里积灰,看着它的成就 ...
随机推荐
- redolog
总结: 教育我们:redo文件组需要创建多个组,建议至少3个,每个组至少2个文件,最好放在不同的硬盘上. 当联机日志文件丢失一般使用清除日志的方法: alter database clear logf ...
- Ubuntu 14.04 上使用 Nginx 部署 Laravel
本教程将会涉及以下工具: Ubuntu 14.04 LTS PHP 5.5 MySQL Laravel 5.0 Nginx 参考文章:Ubuntu 14.04 上使用 Nginx 部署 Laravel ...
- if最简单的用法
/* Name:if最简单的用法-1 Copyright:By.不懂网络 Author: Yangbin Date:2014年2月9日 03:00:58 Description:if最简单的用法,真则 ...
- PADS Layout怎样放置间距一样的同一种元件
少数元件的话,栅格设置是最好的,即将栅格设置成你要放置元件的间距,然后逐个移动元件放置.如果元件几十上百个,这样做就累死人了,此时就得设置阵列.按顺序选择你要放置的元件-右键-create arry, ...
- 在Linux下使用iconv转换字符串编码
在Linux下写C程序,尤其是网络通信程序时经常遇到编码转换的问题,这里要用到iconv函数库. iconv函数库有以下三个函数 123456 #include <iconv.h>icon ...
- 有道翻译API
轻奢侈品_百度百科 轻奢侈品 有道翻译API 有道翻译API申请成功 API key:72763558 keyfrom:lexus-studio
- Asp.net MVC中关于@Html标签的使用
@Html帮助器简单说明,记录些基本的跟HTML中对应的@html帮助器,@Html基本包含了html中的表单控件和常用Html 在@Html中,带有For的主要是针对强类型的Html类型. 用于说明 ...
- CentOS6.6普通用户使用sudo命令借用root用户权限
一.描写叙述 普通用户hadoop使用:tar -xzvf ns2.35.tar.gz命令解压文件,系统提示找不到该文件,无法打开该文件夹,于是想到使用sudo命令借用root用户的权限:sudo t ...
- android UI进阶之弹窗的使用(2)--实现通讯录的弹窗效果
相信大家都体验过android通讯录中的弹窗效果.如图所示: android中提供了QuickContactBadge来实现这一效果.这里简单演示下. 首先创建布局文件: <?xml versi ...
- WCF 双工通信
注释:本学习是参考Artech大神的资料: 在WCF 实现双工通信 在这里我就不介绍双工通信的概念了,我写博客的目的是检测自己掌握情况,看我wcf通信后,觉得纸上得来终觉浅,绝知此事要躬行. 我使用的 ...