目录

  • 题目及翻译
    • 题面
    • 输入
    • 输出
    • 输入样例
    • 输出样例
  • 题目思路
  • 注意事项
  • AC代码
    • C++

题目及翻译

题面

自从2006年3月10日至11日的首届数独世界锦标赛以后,数独这项游戏越来越受到人们的喜爱和重视。
据说,在2008北京奥运会上,会将数独列为一个单独的项目进行比赛,冠军将有可能获得的一份巨大的奖品———HDU免费七日游外加lcy亲笔签名以及同hdu acm team合影留念的机会。
所以全球人民前仆后继,为了奖品日夜训练茶饭不思。当然也包括初学者linle,不过他太笨了又没有多少耐性,只能做做最最基本的数独题,不过他还是想得到那些奖品,你能帮帮他吗?你只要把答案告诉他就可以,不用教他是怎么做的。
数独游戏的规则是这样的:在一个9x9的方格中,你需要把数字1-9填写到空格当中,并且使方格的每一行和每一列中都包含1-9这九个数字。同时还要保证,空格中用粗线划分成9个3x3的方格也同时包含1-9这九个数字。比如有这样一个题,大家可以仔细观察一下,在这里面每行、每列,以及每个3x3的方格都包含1-9这九个数字。
例题:

答案:

输入

本题包含多组测试,每组之间由一个空行隔开。每组测试会给你一个 9*9 的矩阵,同一行相邻的两个元素用一个空格分开。其中1-9代表该位置的已经填好的数,问号(?)表示需要你填的数。

输出

对于每组测试,请输出它的解,同一行相邻的两个数用一个空格分开。两组解之间要一个空行。
对于每组测试数据保证它有且只有一个解。

输入样例

7 1 2 ? 6 ? 3 5 8
? 6 5 2 ? 7 1 ? 4
? ? 8 5 1 3 6 7 2
9 2 4 ? 5 6 ? 3 7
5 ? 6 ? ? ? 2 4 1
1 ? 3 7 2 ? 9 ? 5
? ? 1 9 7 5 4 8 6
6 ? 7 8 3 ? 5 1 9
8 5 9 ? 4 ? ? 2 3

输出样例

7 1 2 4 6 9 3 5 8
3 6 5 2 8 7 1 9 4
4 9 8 5 1 3 6 7 2
9 2 4 1 5 6 8 3 7
5 7 6 3 9 8 2 4 1
1 8 3 7 2 4 9 6 5
2 3 1 9 7 5 4 8 6
6 4 7 8 3 2 5 1 9
8 5 9 6 4 1 7 2 3

题目思路

题目难度不高,关键是想清楚怎么check里怎么判断九宫格
有①个小技巧,==对于任意一个点(x,y),计算x / 3 * 3 + y / 3,就能得出其所在范围 ==
第②个小技巧,先把不确定的数字找出来,然后在这些数字里搜
第③个小技巧,cin可以直接读取一个char字符,并且忽略空格和换行,scanf则需要用%s输入字符串
剩下的就没了,for就完事了,题目也保证了一定有答案

注意事项

两个样例之间隔一个空行,搞清楚就行

AC代码

C++

用时187MS 内存1804K 长度2247B

#include<iostream>
#include<vector>
#include<cstring>
using namespace std;
struct node {//定义一个结构体用来储存坐标int x,y;node(int x = 0,int y =0):x(x),y(y) {//结构体的构造函数,方便使用}
};
int line;
int f[10][10];//记录整个棋盘
int vis[3][10][10];//0标记行1标记列2标记九宫格
char c;
vector<node> vec;//用于储存未知的位置
inline void init() {//初始化函数 inline可以让简单且非递归函数变得可能更快memset(vis,0,sizeof(vis));vec.clear();
}
inline int cube(int x,int y) {//获得九宫格的编号return x / 3 * 3 + y / 3;
}
int dfs(int cur) {if(cur == vec.size())return 1;//所有格子填完后结束递归 int fx = vec[cur].x;//获取当前位置 int fy = vec[cur].y;//获取当前位置 for(int i=1; i<=9; ++i) {//遍历1到9if(vis[0][fx][i])continue;//如果这一行已经有数字i了跳过 if(vis[1][fy][i])continue;//如果这一列已经有数字i了跳过 int flag = cube(fx,fy);//获取当期所在九宫格 if(vis[2][flag][i])continue;//如果九宫格内已经有数字i了跳过 vis[0][fx][i] = 1;//标记这一行已经有i了 vis[1][fy][i] = 1;//标记这一列已经有i了 vis[2][flag][i] = 1;//标记这个九宫格内已经有i了 f[fx][fy] = i;//填上数字 if(dfs(cur + 1))return 1;//找下一个数字,如果找到结束了就结束递归 vis[0][fx][i] = 0;//回溯 vis[1][fy][i] = 0;//回溯 vis[2][flag][i] = 0;//回溯 }return 0;
}
int main() {ios::sync_with_stdio(false); while(cin>>c) {//循环输入 init();f[0][0] = c == '?' ? 0 : c - '0';//输入数字,如果是问号就输入0 for(int i=0; i<9; ++i) {for(int j=0; j<9; ++j) {if(i == 0 && j == 0) continue;//0 0 已经被输入过了 cin>>c;f[i][j] = c == '?' ? 0 : c - '0';}}for(int i=0; i<9; ++i) {//遍历整个棋盘 for(int j=0; j<9; ++j) {if(f[i][j]) {//如果本来就有数字,就在这一行,这一列,这一九宫格标记一下 vis[0][i][f[i][j]] = 1;vis[1][j][f[i][j]] = 1;vis[2][cube(i,j)][f[i][j]] = 1;} else {vec.push_back(node(i,j));//如果没数字,就将其记录 }}}dfs(0);//搜! if(!line)line = 1;//每两个样例 中间 隔一空行 else cout<<endl;for(int i=0; i<9; ++i) {//输出 for(int j=0; j<9; ++j) {if(j)cout<<" ";cout<<f[i][j];}cout<<endl;}}return 0;
}

本文作者 CSDN@扶她小藜
个人主页链接 https://blog.csdn.net/weixin_44579869

HDU1426 Sudoku Killer(dfs)[C++]相关推荐

  1. 搜索 —— 深度优先搜索(DFS)

    [概述] 深度优先搜索,是从初始状态起,利用一定的规则生成搜索树,寻找下一层任一个结点,检查是否出现目标状态,若未出现,以此状态利用规则生成再下一层任一个结点,再检查,重复过程一直到叶节点(即不能再生 ...

  2. 三十二、图的创建深度优先遍历(DFS)广度优先遍历(BFS)

    一.图的基本介绍 为什么要有图 前面我们学了线性表和树 线性表局限于一个直接前驱和一个直接后继的关系 树也只能有一个直接前驱也就是父节点 当我们需要表示多对多的关系时, 这里我们就用到了图. 图的举例 ...

  3. 【 MATLAB 】离散傅里叶级数(DFS)及 IDFS 的 MATLAB 实现

    有关离散傅里叶级数(DFS)我之前也写过一些博文,例如:离散周期信号的傅里叶级数(DFS) 这里我再次给出标准公式. 分析式: 其中: 综合式: 这里我必须先声明,关于分析式和综合式前面那个系数1/N ...

  4. 部署分布式文件系统(DFS)

    部署分布式文件系统(DFS) 使用 DFS 命名空间,可以将位于不同服务器上的共享文件夹组合到一个或多个逻辑结构的命名空间.每个命名空间作为具有一系列子文件夹的单个共享文件夹显示给用户.但是,命名空间 ...

  5. Java实现算法导论中图的广度优先搜索(BFS)和深度优先搜索(DFS)

    对算法导论中图的广度优先搜索(BFS)和深度优先搜索(DFS)用Java实现其中的伪代码算法,案例也采用算法导论中的图. import java.util.ArrayList; import java ...

  6. 广度优先搜索(BFS)与深度优先搜索(DFS)

    一.广度优先搜索(BFS) 1.二叉树代码 # 实现一个二叉树 class TreeNode:def __init__(self, x):self.val = xself.left = Nonesel ...

  7. 7.9模拟赛T1图的遍历(dfs)

    图的遍历(dfs) [题目描述] 对于一个有向图G来说,我们存在一个经典的遍历算法,就是DFS (深度优先搜索遍历).将G以1号点为起点进行DFS后,我们可以 得到G的一棵DFS遍历树T.就此,我们可 ...

  8. 7.6 T1 深度优先搜索(dfs)

    深度优先搜索(dfs) [题目描述] sol:50pts随便写写,就是大众分了,直接n2dpOK,100分要找点规律,需要数学头脑 官方题解 //#include <bits/stdc++.h& ...

  9. 二叉树的深度优先遍历(DFS)与广度优先遍历(BFS)

    二叉树的深度优先遍历(DFS)与广度优先遍历(BFS) 深度优先遍历:从根节点出发,沿着左子树方向进行纵向遍历,直到找到叶子节点为止.然后回溯到前一个节点,进行右子树节点的遍历,直到遍历完所有可达节点 ...

  10. 深度优先遍历(DFS)- Letter CasePermutation - Combinations

    深度优先遍历(DFS) 思路:从图中一个未访问的顶点V开始,沿着一条路一直走到尽头,然后从这条路尽头的节点回退到上一个节点,再从另一条路开始走到尽头-,不断递归重复此过程,直到所有顶点都遍历完成. 特 ...

最新文章

  1. 判断丑数python_LintCode Python 简单级题目 517.丑数
  2. js06--函数库jq与prototype
  3. 「云+未来」上海峰会,报名开启
  4. 快充线与普通线的区别_四种不同线身材质对比:iPhone12首次标配编织线或将引领潮流?...
  5. psql物化视图自动更新
  6. ORACLE自增长字段实现(转)
  7. python能做什么毕业设计-毕业设计涉及到python?看我用Python优雅的写论文!
  8. 六子棋人机程序Java版(附源码+设计思路)
  9. 软件过程管理期末复习资料
  10. python3 接口获取数据
  11. richface 皮肤
  12. dns遭到劫持_被域名劫持了怎么办 域名劫持的几个解决办法域名给别人劫持怎么办...
  13. 【ALM】POLARION ALM之需求管理解决方案介绍02
  14. 177本名著浓缩成了177句话!别等自己做错时才明白
  15. 教你自制五星级大酒店用的调味品
  16. linux系统中同一台服务器部署两个tomcat
  17. JixiPix Aquarella for Mac(图片转水彩画工具)
  18. Windows下用pandoc将LaTex转成Word——使用错误总结
  19. win10任务栏点击没反应
  20. 小米鸿蒙os界面,早报 | 小米官宣第二款5G机;鸿蒙OS系统界面首曝

热门文章

  1. matlab ode15,matlab用ode15数值计算微分代数方程(DAE)的问题
  2. 矢量图和位图最大的区别是什么?
  3. 10年量化大佬的PTA基本面量化方法论:教你19秒生成一份研报
  4. 读懂你,不容易——致我的寒假音标学习
  5. 十三、Python第十三课——类(包含对类的相关概念的理解,这一文的附录让你彻底明白类和对象)
  6. 《进大厂系列》系列-Redis常见面试题(带答案)
  7. 远程服务器配置 Anaconda 并安装 PyTorch 详细教程
  8. Java GC 日志详解(一图读懂)
  9. 江西财经大学信息管理学院计算机系,江西财经大学信息管理学院研究生导师介绍:刘德喜...
  10. CSS 3渐变色效果