题目链接: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. Visual Studio之Nuget

    一.NuGet是什么? NuGet是一个为大家所熟知的Visual Studio扩展,通过这个扩展,开发人员可以非常方便地在Visual Studio中安装或更新项目中所需要的第三方组件,同时也可以通 ...

  2. google base库之simplethread

    // This is the base SimpleThread. You can derive from it and implement the // virtual Run method, or ...

  3. ROS中编辑文件命令行工具rosed

    rosed是rosbash套件中的一个,它允许我们通过包名直接编辑包中的文件,而不是输入包的全部路径. 用法: rosed [package_name] [filename] 例如: rosed ro ...

  4. PHP合并数组+与array_merge的区别分析

    主要区别是两个或者多个数组中如果出现相同键名,键名分为字符串或者数字,需要注意 1)键名为数字时,array_merge()不会覆盖掉原来的值,但+合并数组则会把最先出现的值作为最终结果返回,而把后面 ...

  5. zoj 2589 Matrix Searching 二维线段树

    题目链接 给一个n*n的矩阵, 给q个查询, 每次给出x1, y1, x2, y2, 求这个矩阵中的最小值. 代码基本上和上一题相同... #include<bits/stdc++.h> ...

  6. spring与hibernate整合配置基于Annotation注解方式管理实务

    1.配置数据源 数据库连接基本信息存放到properties文件中,因此先加载properties文件 <!-- jdbc连接信息 --> <context:property-pla ...

  7. maven打包成第三方jar包且把pom依赖包打入进来

    <build> <plugins> <plugin> <artifactId>maven-assembly-plugin</artifactId& ...

  8. win7中注册tomcat服务

    非安装版tomcat下载后,在bin文件夹会有一个startup.bat文件,运行该文件即可启动tomcat了.不过在服务器配置tomcat的话,就通常需要注册为服务. 在/bin文件下还有tomca ...

  9. AAU账号分割

    import win.ui; import fsys.dlg; import string.list; /*DSG{{*/ var winform = win.form(text="aard ...

  10. 监控Informix-Url

    jdbc:informix-sqli://[{ip-address|host-name}:{port-number|service-name}][/dbname]: INFORMIXSERVER=se ...