题目链接: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)的更多相关文章

  1. hdu 1426 Sudoku Killer (dfs)

    Sudoku Killer Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Tot ...

  2. HUD 1426 Sudoku Killer (DFS)

    链接 : Here! 思路 : 记录下所有 "?" , 出现的位置, 然后 $DFS$ 一下, 对于每个位置来说都可以填充 $9$ 种数值, 然后对于判断填充是否合法需要三个标记数 ...

  3. HDU1426 Sudoku Killer(DFS暴力) 2016-07-24 14:56 65人阅读 评论(0) 收藏

    Sudoku Killer Problem Description 自从2006年3月10日至11日的首届数独世界锦标赛以后,数独这项游戏越来越受到人们的喜爱和重视. 据说,在2008北京奥运会上,会 ...

  4. hdu 1426:Sudoku Killer(DFS深搜,进阶题目,求数独的解)

    Sudoku Killer Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Tot ...

  5. HDU 1426 Sudoku Killer(dfs 解数独)

    传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1426 Sudoku Killer Time Limit: 2000/1000 MS (Java/Oth ...

  6. P - Sudoku Killer HDU - 1426(dfs + map统计数据)

    P - Sudoku Killer HDU - 1426 自从2006年3月10日至11日的首届数独世界锦标赛以后,数独这项游戏越来越受到人们的喜爱和重视. 据说,在2008北京奥运会上,会将数独列为 ...

  7. hdu1426 Sudoku Killer

    Sudoku Killer Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other) Total ...

  8. Sudoku Killer

    Problem Description 自从2006年3月10日至11日的首届数独世界锦标赛以后,数独这项游戏越来越受到人们的喜爱和重视. 据说,在2008北京奥运会上,会将数独列为一个单独的项目进行 ...

  9. Steam 游戏 《Sudoku Universe(数独宇宙)》、《Sudoku Killer(数独杀手)》、《Sudoku Jigsaw(数独拼图)》数字位置解析 ---------C# 数独程序解析(2020年寒假小目标11)

    日期:2020.02.11 博客期:151 星期二 今天,准备肝一个 C# 的数独读写工具(汇编语言也在努力学习命令方法中...),这三个游戏我早就买下了,一直放在 Steam 库里积灰,看着它的成就 ...

随机推荐

  1. lab4 Cache Geometries 深入理解计算机系统——高速缓存

    这个实验主要是将高速缓存命中的一点东西,意在告诉我们平常多注意这方面的东西. 不懂java的,所以只管C的部分. You will do this several times, making smal ...

  2. Eclipse中搭建Python开发环境

    转载:http://www.cnblogs.com/realh/archive/2010/10/04/1841907.html Eclipse+PyDev环境搭建 1.准备工作 JDK6 Java 开 ...

  3. jquery 工作笔记,不断整理中..

    $('input:radio[name="ruleType"]:checked').val()  //获得radio选中的值 $("input[name='Q_lastU ...

  4. qemu/kvm/qemu-kvm/virsh的区别

    转自:http://www.2cto.com/os/201305/209596.html qemu/kvm/qemu-kvm/virsh的区别   qemu是一套虚拟机管理系统,kqemu是qemu的 ...

  5. php mvc 框架演示

    <pre name="code" class="cpp"><pre name="code" class="pyt ...

  6. 经验分享:CSS浮动(float,clear)通俗讲解 太棒了,清晰明了

    很早以前就接触过CSS,但对于浮动始终非常迷惑,可能是自身理解能力差,也可能是没能遇到一篇通俗的教程. 前些天小菜终于搞懂了浮动的基本原理,迫不及待的分享给大家. 写在前面的话: 由于CSS内容比较多 ...

  7. Cola:一个分布式爬虫框架 - 系统架构 - Python4cn(news, jobs)

    Cola:一个分布式爬虫框架 - 系统架构 - Python4cn(news, jobs) Cola:一个分布式爬虫框架 发布时间:2013-06-17 14:58:27, 关注:+2034, 赞美: ...

  8. UBER人民优步司机注册攻略

        注意:本文驾驶证行驶证图片为本人拍摄,请广大网友勿作它用 转载请修改! 详细的介绍注册优步uber司机端步骤; uber对司机的要求: 车辆为本地牌照 车龄在5年以内 裸车价格在10万以上 目 ...

  9. request.getParameterValues与request.getParameter的差别

    一. 简单的对照 request.getParameter用的比較多,相对熟悉 request.getParameterValues(String   name)是获得如checkbox类(名字同样, ...

  10. SDWebImage缓存

    缓存图片方法 [[SDImageCache sharedImageCache] storeImage:myImage forKey:myCacheKey]; 读取缓存 UIImage *myCache ...