数独

时限: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 ;
}

最新文章

  1. UIScrollView的常见属性
  2. redis数据类型之—Hash
  3. September 9th 2016 Week 37th Friday
  4. HTML5探索一(那些新增的标签和属性)
  5. 锋利的jQuery第2版学习笔记8~11章
  6. Spark Streaming 原理剖析
  7. mysql中查询&quot;_&quot;这种特殊字符
  8. USB OTG
  9. Cloudera Manager Free Edition 4.1 和CDH 4.1.2 简易安装教学
  10. 判断当前设备是移动端或者PC端
  11. 【XSY1602】安全网络 树形DP 数学
  12. sublime-代码提示
  13. Centos7查询开机启动项服务
  14. layui upload 后台获取不到值
  15. git学习笔记(一)—— git环境搭建
  16. 手机端布局,rem布局动态获取根字体大小
  17. mysql 数据操作 单表查询 group by 聚合函数
  18. 牛客网字节跳动冬令营网络赛J Sortable Path on Tree —— 点分治
  19. IP代理池之验证是否有效
  20. ios点击链接直接跳转到 App Store 指定应用下载页面

热门文章

  1. 阿里nacos k8s部署
  2. TCP/IP学习笔记11--无线通信: 无线通信的种类, 点对点通信协议
  3. gitlab 重置密码
  4. pytorch1.0实现RNN for Regression
  5. 转:路由 router-view
  6. 又是a+b
  7. ALV报表——抓取工单长文
  8. python检测当前网卡流量信息,用于查看实时网速
  9. L2范数归一化概念和优势
  10. 【转载】Intellij IDEA神器居然还有这些小技巧