数独

时限: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. kubectl exec 执行 容器命令

    格式如下: kubectl exec -it podName -c containerName -n namespace -- shell comand 1 创建目录 kubectl exec -it ...

  2. [Oracle] - 使用32位 PLSQL(PL/SQL Developer)登陆64位Oracle失败之解决

    配置环境 Oracle服务端oracle_winx64_12c_database.iso Oracle客户端instantclient-basiclite-nt-12.1.0.1.0.zip 集成开发 ...

  3. Tomcat中不能通过访问自己IP,但可以通过localhost/127.0.0.1访问

    一.问题如下:局域网内,自己机器部署了一个tomcat应用,在本机上可以通过如下方式访问引用.  http://localhost:8080/xxxx http://127.0.0.1:8080/xx ...

  4. 通俗理解TCP的三次握手

    三次握手流程的本质,可以这么理解:TCP的三次握手其实是双方各一次握手,各一次确认,只是其中一次握手和确认合并在一起. 当然也可以更通俗的去理解: "喂,你听得到吗?" " ...

  5. Visual Studio快速入门(大纲)

    安装与配置 下载 配置Visual Studio环境支持C++桌面编程 Hello World 支持C++98 ( Hello World) 支持C++17( Hello World) 配置Visua ...

  6. OpenCV学习笔记5

    OpenCV学习笔记5 图像变换 傅里叶变换 这里可以先学习一下卷积分,了解清除卷积的过程和实际意义,在看这一章节的内容. 原理: 傅里叶变换经常被用来分析不同滤波器的频率特性.我们可以使用 2D 离 ...

  7. oracle update left join 写法

    oracle update left join 写法 (修改某列,条件字段在关联表中) 案例: E:考核表 X,:用户表 USERNAME 关联 需求:修改营业部最高分 分析:通过登录账号的营业部OR ...

  8. Bipartite Checking CodeForces - 813F (线段树按时间分治)

    大意: 动态添边, 询问是否是二分图. 算是个线段树按时间分治入门题, 并查集维护每个点到根的奇偶性即可. #include <iostream> #include <sstream ...

  9. maven一些简单常用却容易记混的命令参数-U -e -B

    install 命令完成了项目编译.单元测试.打包功能,同时把打好的可执行jar包(war包或其它形式的包)布署到本地maven仓库,但没有布署到远程Maven私服仓库: deploy 命令完成了项目 ...

  10. LeetCode每日一练(1-3)

    题目导航 1. 两数之和 2. 两数相加 3. 无重复字符的最长子串 1. 两数之和 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的 ...