【基础搜索】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是否出现 ...
随机推荐
- mysql的HA及openstack和k8s区别
数据库HA(Hight Availability) mysql自身支持主主/主备部署,多主(>2),一主多备 galera mariadb集群:多主相互备份 修改容器的启动配置 修改Docker ...
- SQL网页端在线自定义查询工具
TreeSoft数据库管理系统,是用JAVA开发,基于网页的数据库SQL查询工具.功能包括:数据库的展示,库表的展示,表字段结构的展示,SQL语句的在 线编辑批量执行,表结构的在线设计维护,数据的在线 ...
- CF1223D Sequence Sorting
思路: 首先把数组离散化,然后观察可以发现,在最优解中最终没有被移动过的那些数字一定是连续的,那么找到最长的连续的数字长度即可. 实现: #include <bits/stdc++.h> ...
- PHP替代session的方法
PHP替代session的方法 服务器集群的时候 会发现session的问题 一般采用redis 来代替 用账号作为key 因为redis能主从 所以打算用替代session的方法1 cookie代替 ...
- Stream知识点总结及源码阅读
上次[http://www.cnblogs.com/webor2006/p/7795596.html]对Stream进行了简单的学习,这次继续学习Stream,还是结合java8 in action这 ...
- 【剑指offer】面试题 25. 合并两个排序的链表
面试题 25. 合并两个排序的链表 NowCoder 题目描述 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. Java 实现 ListNode Clas ...
- (三)shiro的认证
文章目录 认证思路 自定义用于登录检验的Realm的思路 代码实现 后记 认证思路 调用 SecurityUtils.getSubject() 方法,获取当前的 Subject 对象 : 调用 Sub ...
- C++Primer 5th Chap10 Generic Algorithms(未完)
大多数算法定义在头文件algorithm中,在头文件numeric中定义了数值泛型算法. 以find算法为例:在容器的两个迭代器指定的范围内遍历,查找特定值. auto result= cout< ...
- Python程序设计基本方法图
Python程序设计基本方法图
- 怎样检测浏览器是否安装了某个插件, 比如flash
首先, 我们可以获取浏览器安装的所有在插件: navigator.plugins 它会返回一个类似数组的对象, 包含所有已安装插件的具体信息. navigator.plugins; 然后我们可以通过正 ...