题目背景
雷蒻的兴趣极为的广泛。某一天,雷蒻接触到了一个神奇的东西,叫做数独。于是,雷蒻开始搜罗广大的雷蒻的数独题,并且在2s之内解除了号称“世界第一难”的数独(当然,用了一个小时编程)。
题目描述
现在,因为雷蒻知道你过于的雷蒻。所以,他只给你一个9*9的标准数独。雷蒻怕你连标准数独的规则都不知道,于是雷蒻不得不做他短短13年人生中的第1000000^1000000%10+1次数独规则介绍:给定一个9*9的空矩阵,现在请你在这个空矩阵中填写1到9个9数字,使每行,每列与每个九宫格中的数都不重复。现在,雷蒻给了你一个标准数独,已填的数字直接用原有数字表示,而待填的空格用‘#’表示(具体请见样例)。请你给出这个雷蒻的数独的任意一个解。(我们的SpecialJudge会为你排忧解难)
输入输出格式
输入格式:一个9*9的字符矩阵,表示一个数独,如题目描述般输入。
输出格式:一个对应的数独问题的解。
输入输出样例
输入样例#1:
#7###95## ######46# 8###2#### 29##1#### 4#6#87#31 #8#2539## 7148#2395 56839#724 #3#74561#
输出样例#1:
671439582 325178469 849526173 293614857 456987231 187253946 714862395 568391724 932745618
说明
数据保证有解。
对于5%的数据,全是'#'
对于另外5%的数据,全是数字
对于50%的数据,保证有多组解
数据单点时间限制2s
全部数据保证数独有解
---------------代码实现(时间复杂度较高)---------------
#include<iostream>
using namespace std;bool sign = false;
int num[9][9],x,y;
bool check(int n, int key)
{
for(int i=0;i<9;i++)
{
int j=n/9;
if(num[j][i]==key) return false;
}
for(int i=0;i<9;i++)
{
int j=n%9;
if(num[i][j]==key) return false;
}
x=n/9/3*3;
y=n%9/3*3;
for(int i=x;i<x+3;i++)
{
for(int j=y;j<y+3;j++)
{
if (num[i][j]==key) return false;
}
}
return true;
}
int DFS(int n)
{
if (n>80)
{
sign=true;
return 0;
}
if(num[n/9][n%9]!= 0)
{
DFS(n+1);
}
else
{
for(int i=1;i<=9;i++)
{
if(check(n,i))
{
num[n/9][n%9]=i;
DFS(n+1);
if(sign == true) return 0;
num[n/9][n%9]=0;
}
}
}
}
int main()
{
char temp[9][9];
for(int i=0;i<9;i++)
{
for(int j=0;j<9;j++)
{
cin>>temp[i][j];
if(temp[i][j]=='#') temp[i][j]='0';
num[i][j]=temp[i][j]-'0';
}
}
DFS(0);
for(int i=0;i<9;i++)
{
for(int j=0;j<9;j++)
{
cout<<num[i][j];
}
cout<<endl;
}
return 0;
}