【基础搜索】poj-2676-Sudoku(数独)--求补全九宫格的一种合理方案
数独
描述 数独是一个非常简单的任务。一个9行9列的正方形表被分成9个较小的3x3,如图所示。在一些单元格中,从1写到9的十进制数字。其他细胞是空的。目标是用从1到9的十进制数字填充空单元格,每个单元格有一个数字,这样在每一行、每列和每个标记为3x3的子方格中,将出现从1到9的所有数字。编写一个程序来解决给定的数独任务.
![]() 输入 输入数据将从测试用例的数量开始。对于每个测试用例,后面有9行,对应于表的行。在每一行上都会给出一个精确的9位小数字符串,对应于这一行中的单元格。如果单元格为空,则由0表示。
输出量 对于每个测试用例,您的程序应该以与输入数据相同的格式打印解决方案。空的单元格必须按照规则填充。如果解决方案不是唯一的,那么程序可以打印其中的任何一个。
样本输入 1 样本输出 143628579 来源 |
||||||||||
大致题意和思路:
题目中的部分点是固定的,需要在第一遍读入中处理完;接着进行依次深度优先搜索,每枚举一位,要判断是否与当前行冲突或者当前列冲突,或者是否当前所在的小格子里的冲突了;如果都没有那么当前状态就达到了“稳定”,接着迭代搜索下一位,直到完成即可!
搜索的时候,会遇见三种情况,上面是第一种,第二种是遇见固定的直接跳到下一位,如果下一位(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(数独)--求补全九宫格的一种合理方案的更多相关文章
- POJ 2676 Sudoku (数独 DFS)
Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 14368 Accepted: 7102 Special Judg ...
- 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 ...
- 深搜+回溯 POJ 2676 Sudoku
POJ 2676 Sudoku Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 17627 Accepted: 8538 ...
- ACM : POJ 2676 SudoKu DFS - 数独
SudoKu Time Limit:2000MS Memory Limit:65536KB 64bit IO Format:%lld & %llu POJ 2676 Descr ...
- 【AJAX】AJAX实现搜索信息自己主动推荐并补全
好久没有继续看AJAX的视频教程了,今天就将最后一个教程案例做完.我们在搜索引擎中输入文字时文本框下会提示对应的信息,这个案例就是实现这样的基本功能,代码比較粗糙还须要进一步完好,当中有些地方也须要向 ...
- 搜索 --- 数独求解 POJ 2676 Sudoku
Sudoku Problem's Link: http://poj.org/problem?id=2676 Mean: 略 analyse: 记录所有空位置,判断当前空位置是否可以填某个数,然后直 ...
- POJ 2676 - Sudoku - [蓝桥杯 数独][DFS]
题目链接:http://poj.org/problem?id=2676 Time Limit: 2000MS Memory Limit: 65536K Description Sudoku is a ...
- POJ 2676 Sudoku
Sudoku Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 12005 Accepted: 5984 Special ...
- DFS POJ 2676 Sudoku
题目传送门 题意:数独问题,每行每列以及每块都有1~9的数字 分析:一个一个遍历会很慢.先将0的位子用vector存起来,然后用rflag[i][num] = 1 / 0表示在第i行数字num是否出现 ...
随机推荐
- kubectl exec 执行 容器命令
格式如下: kubectl exec -it podName -c containerName -n namespace -- shell comand 1 创建目录 kubectl exec -it ...
- [Oracle] - 使用32位 PLSQL(PL/SQL Developer)登陆64位Oracle失败之解决
配置环境 Oracle服务端oracle_winx64_12c_database.iso Oracle客户端instantclient-basiclite-nt-12.1.0.1.0.zip 集成开发 ...
- Tomcat中不能通过访问自己IP,但可以通过localhost/127.0.0.1访问
一.问题如下:局域网内,自己机器部署了一个tomcat应用,在本机上可以通过如下方式访问引用. http://localhost:8080/xxxx http://127.0.0.1:8080/xx ...
- 通俗理解TCP的三次握手
三次握手流程的本质,可以这么理解:TCP的三次握手其实是双方各一次握手,各一次确认,只是其中一次握手和确认合并在一起. 当然也可以更通俗的去理解: "喂,你听得到吗?" " ...
- Visual Studio快速入门(大纲)
安装与配置 下载 配置Visual Studio环境支持C++桌面编程 Hello World 支持C++98 ( Hello World) 支持C++17( Hello World) 配置Visua ...
- OpenCV学习笔记5
OpenCV学习笔记5 图像变换 傅里叶变换 这里可以先学习一下卷积分,了解清除卷积的过程和实际意义,在看这一章节的内容. 原理: 傅里叶变换经常被用来分析不同滤波器的频率特性.我们可以使用 2D 离 ...
- oracle update left join 写法
oracle update left join 写法 (修改某列,条件字段在关联表中) 案例: E:考核表 X,:用户表 USERNAME 关联 需求:修改营业部最高分 分析:通过登录账号的营业部OR ...
- Bipartite Checking CodeForces - 813F (线段树按时间分治)
大意: 动态添边, 询问是否是二分图. 算是个线段树按时间分治入门题, 并查集维护每个点到根的奇偶性即可. #include <iostream> #include <sstream ...
- maven一些简单常用却容易记混的命令参数-U -e -B
install 命令完成了项目编译.单元测试.打包功能,同时把打好的可执行jar包(war包或其它形式的包)布署到本地maven仓库,但没有布署到远程Maven私服仓库: deploy 命令完成了项目 ...
- LeetCode每日一练(1-3)
题目导航 1. 两数之和 2. 两数相加 3. 无重复字符的最长子串 1. 两数之和 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的 ...
