数独

时限:2000 MS   内存限制:65536K
提交材料共计: 22682   接受: 10675   特别法官

描述

数独是一个非常简单的任务。一个9行9列的正方形表被分成9个较小的3x3,如图所示。在一些单元格中,从1写到9的十进制数字。其他细胞是空的。目标是用从1到9的十进制数字填充空单元格,每个单元格有一个数字,这样在每一行、每列和每个标记为3x3的子方格中,将出现从1到9的所有数字。编写一个程序来解决给定的数独任务.

输入

输入数据将从测试用例的数量开始。对于每个测试用例,后面有9行,对应于表的行。在每一行上都会给出一个精确的9位小数字符串,对应于这一行中的单元格。如果单元格为空,则由0表示。

输出量

对于每个测试用例,您的程序应该以与输入数据相同的格式打印解决方案。空的单元格必须按照规则填充。如果解决方案不是唯一的,那么程序可以打印其中的任何一个。

样本输入

1
103000509
002109400
000704000
300502006
060000050
700803004
000401000
009205800
804000107

样本输出

143628579
572139468
986754231
391542786
468917352
725863914
237481695
619275843
854396127

来源


大致题意和思路:

  题目中的部分点是固定的,需要在第一遍读入中处理完;接着进行依次深度优先搜索,每枚举一位,要判断是否与当前行冲突或者当前列冲突,或者是否当前所在的小格子里的冲突了;如果都没有那么当前状态就达到了“稳定”,接着迭代搜索下一位,直到完成即可!

  搜索的时候,会遇见三种情况,上面是第一种,第二种是遇见固定的直接跳到下一位,如果下一位(x,y)的y是10的话,就可以达到巧妙换行的要求了。


题解:

#include<stdio.h>
#include<iostream>
#include<string.h>
#include<vector>
#include<math.h>
#include<stdlib.h>
#include<algorithm>
#include<set>
#include<string.h>
#include<string>
#include<map>
#include<queue>
using namespace std; #define ll long long
#define ull unsigned long long
#define inf 0x3f3f3f3f int a[][];//从(1,1)一直存到(9,9)
bool vis[][];
bool Fixed[][];//当前位置是否可以已经固定了!
bool grid[][];//1--9的大方格的1--9的使用了1/0次
bool row[][];//横行
bool col[][];//列
int flag;
int getnum(int i,int j){//返回(i,j)所在的小九宫格的序号
if(i>=&&i<=&&j>=&&j<=)return ;
if(i>=&&i<=&&j>=&&j<=)return ;
if(i>=&&i<=&&j>=&&j<=)return ; if(i>=&&i<=&&j>=&&j<=)return ;
if(i>=&&i<=&&j>=&&j<=)return ;
if(i>=&&i<=&&j>=&&j<=)return ; if(i>=&&i<=&&j>=&&j<=)return ;
if(i>=&&i<=&&j>=&&j<=)return ;
if(i>=&&i<=&&j>=&&j<=)return ;
} void init(){
memset(Fixed,false,sizeof(Fixed));
memset(a,,sizeof(a));
memset(vis,false,sizeof(false));
memset(grid,false,sizeof(grid));
flag=;
memset(row,false,sizeof(row));
memset(col,false,sizeof(col)); } void dfs(int i,int j){
if(flag==)return ;
if(i==&&j==){
for(int i=;i<=;i++){
for(int j=;j<=;j++){
printf("%d",a[i][j]);
}
cout<<endl;
}
flag=;
return ;
}
if(j==)
dfs(i+,);
else if(Fixed[i][j]==true)
dfs(i,j+);
else{
int num;
for(num=;num<=;num++){
if(flag==)return ;
if(grid[getnum(i,j)][num]==true)continue;
if(row[i][num]==true)continue;
if(col[j][num]==true)continue; a[i][j]=num;//记录结果!!
grid[getnum(i,j)][num]=true;
row[i][num]=true;col[j][num]=true;
dfs(i,j+);
row[i][num]=false;col[j][num]=false;
grid[getnum(i,j)][num]=false;
}
} }
int main(){
int T;
scanf("%d",&T);
while(T--){
init();
int x;
for(int i=;i<=;i++){
for(int j=;j<=;j++){
scanf("%1d",&x);
if(x!=){
a[i][j]=x;
Fixed[i][j]=true;
grid[getnum(i,j)][x]=;
row[i][x]=;
col[j][x]=;
}
}
}
dfs(,);
} return ;
}

【基础搜索】poj-2676-Sudoku(数独)--求补全九宫格的一种合理方案的更多相关文章

  1. POJ 2676 Sudoku (数独 DFS)

      Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 14368   Accepted: 7102   Special Judg ...

  2. POJ - 2676 Sudoku 数独游戏 dfs神奇的反搜

    Sudoku Sudoku is a very simple task. A square table with 9 rows and 9 columns is divided to 9 smalle ...

  3. 深搜+回溯 POJ 2676 Sudoku

    POJ 2676 Sudoku Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 17627   Accepted: 8538 ...

  4. ACM : POJ 2676 SudoKu DFS - 数独

    SudoKu Time Limit:2000MS     Memory Limit:65536KB     64bit IO Format:%lld & %llu POJ 2676 Descr ...

  5. 【AJAX】AJAX实现搜索信息自己主动推荐并补全

    好久没有继续看AJAX的视频教程了,今天就将最后一个教程案例做完.我们在搜索引擎中输入文字时文本框下会提示对应的信息,这个案例就是实现这样的基本功能,代码比較粗糙还须要进一步完好,当中有些地方也须要向 ...

  6. 搜索 --- 数独求解 POJ 2676 Sudoku

    Sudoku Problem's Link:   http://poj.org/problem?id=2676 Mean: 略 analyse: 记录所有空位置,判断当前空位置是否可以填某个数,然后直 ...

  7. POJ 2676 - Sudoku - [蓝桥杯 数独][DFS]

    题目链接:http://poj.org/problem?id=2676 Time Limit: 2000MS Memory Limit: 65536K Description Sudoku is a ...

  8. POJ 2676 Sudoku

    Sudoku Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 12005   Accepted: 5984   Special ...

  9. DFS POJ 2676 Sudoku

    题目传送门 题意:数独问题,每行每列以及每块都有1~9的数字 分析:一个一个遍历会很慢.先将0的位子用vector存起来,然后用rflag[i][num] = 1 / 0表示在第i行数字num是否出现 ...

随机推荐

  1. PHP与Memcached服务器交互的分布式实现源码分析

    转自: http://blog.csdn.net/hguisu/article/details/7353595 前段时间,因为一个项目的关系,研究了php通过调用memcache和memcached ...

  2. Python19之函数和过程

    一.函数和过程 函数和过程都是指一段实现特定功能的代码段,如果该代码段有返回值则称为函数,否则称为过程. 注:Python中只有函数而没有过程,就算是函数体内没有return语句返回一个值,Pytho ...

  3. Linux基础-12-yum管理软件包

    1. yum的功能 yum是Yellow dog Updater, Modified的缩写,目的就是为了解决RPM的依赖关系的问题,方便使用者进行软件的安装.升级等等工作. 2. 光盘挂载和镜像挂载 ...

  4. LINUX驱动笔记 目录

    笔记参考了宋宝华老师的<Linux设备驱动开发详解:基于最新的Linux 4.0内核>以及韦东山老师的嵌入式驱动教程 笔记开发环境: 单板:第一章到第八章使用TINY4412-1611:第 ...

  5. 立体像对空间前方交会-共线方程求解法(python实现)

    一.原理 二.步骤 a.用各自像片的角元素计算出左右像片的旋转矩阵R1和R2. b.有同名像点列出共线方程. c.将方程写为未知数的线性方程形式,计算线性系数. d.写出误差方程,系数矩阵与常数项. ...

  6. Luogu5280 [ZJOI2019] 线段树 【线段树】

    题目分析: 这题除了分类讨论就没啥了... 容易发现问题实际就是所有操作选和不选按顺序执行的所有答案和.考虑每个点在多少种情况下会有tag. 那么,考虑新插入一个[l,r],所有有交集的点都会被清空, ...

  7. Codeforces Round #222 (Div. 1) (ABCDE)

    377A Maze 大意: 给定棋盘, 保证初始所有白格连通, 求将$k$个白格变为黑格, 使得白格仍然连通. $dfs$回溯时删除即可. #include <iostream> #inc ...

  8. Dockfile文件解析

    1. Dockerfile内容基础知识 每条保留字指令都必须为大写字母且后面要跟随至少一个参数 指令按照从上到下,顺序执行 #表示注释 每条指令都会创建一个新的镜像层,并对镜像进行提交 2. Dock ...

  9. 【转发】Java split()用法

    特殊情况有 * ^ : | . \ 一.单个符号作为分隔符  String address="上海\上海市|闵行区\吴中路"; String[] splitAddress=addr ...

  10. 洛谷 P1217 回文质数

    洛谷 P1217 回文质数 链接 https://www.luogu.org/problem/P1217 题目 题目描述 因为 151 既是一个质数又是一个回文数(从左到右和从右到左是看一样的),所以 ...