Description
There is really only one rule:
Fill in the grid so that
every row,
every column, and
every 3 x 3 box
contains the digits 1 through 9.
这个游戏只有一个规则:
将格子填满使得
每一行,
每一列,和
每一个小的九宫格
恰好包含1-9这9个数字
正是由于规则简单而又变化多端,数独一时间风靡全球。
现在,我们希望你能编写一个程序解决数独问题。
Input
输入数据一共9行,每行有9个字符。
输入数据描述了一个待解决的数独,其中,“?”表示数独中的空缺。
我们的输入数据总保证有唯一解。
Output
输出一共9行,每行9个数字,表示你的答案。
Sample Input
5????7??6
?6????5?4
?834?????
???182?4?
??1???9??
?7?369???
?????543?
1?5????9?
7??2????1
Sample Output
514927386
967831524
283456179
659182743
321574968
478369215
892615437
135748692
746293851
题库里唯一一道数独:
。。
暴力解法都能过,
刚学了DLX。
拿来练练手。
DLX的详细资料网上都有,
我也就不献丑了。
我模仿的刘汝佳的风格。
挺优美的。
代码如下:
#include<iostream>
#include<iomanip>
#include<cstring>
#include<cmath>
#include<cstdio>
#include<vector>
using namespace std;
int Slot=0;
int Row=1;
int Con=2;
int Sub=3;
const int Maxn=9*9*4*9*9*9;
int U[Maxn];
int D[Maxn];
int R[Maxn];
int L[Maxn];
int S[9*9*4];
int row[Maxn];
int con[Maxn];
int size=0;
int yama(int a,int b,int c){
return a*81+b*9+c+1;
}
int jiema(int val,int &a,int &b,int &c){
val--;
c=val%9;
val/=9;
b=val%9;
val/=9;
a=val;
}
void init(int n){
for(int i=0;i<=n;i++){
R[i]=i+1;
L[i]=i-1;
U[i]=i;
D[i]=i;
}
L[0]=n;
R[n]=0;
size=n+1;
}
void ins(int r,vector<int> Q){
int first=size;
for(int i=0;i<Q.size();i++){
int c=Q[i];
R[size]=size+1;L[size]=size-1;
U[size]=U[c];D[size]=c;
D[U[c]]=size;U[c]=size;
row[size]=r;con[size]=c;
S[c]++;size++;
}
L[first]=size-1;R[size-1]=first;
}
void del(int v){
R[L[v]]=R[v];
L[R[v]]=L[v];
for(int i=D[v];i!=v;i=D[i])
for(int j=R[i];j!=i;j=R[j]){
U[D[j]]=U[j];
D[U[j]]=D[j];
S[con[j]]--;
}
}
void restore(int v){
for(int i=U[v];i!=v;i=U[i])
for(int j=L[i];j!=i;j=L[j]){
U[D[j]]=j;
D[U[j]]=j;
S[con[j]]++;
}
R[L[v]]=v;
L[R[v]]=v;
}
int ans[9*9];
int Map[10][10];
void print(){
for(int i=0;i<9*9;i++){
int a,b,c;
jiema(ans[i],a,b,c);
Map[a][b]=c;
}
for(int i=0;i<9;i++){
for(int j=0;j<9;j++)printf("%d",Map[i][j]+1);
printf("\n");
}
printf("\n");
}
bool dfs(int d){
if(R[0]==0){
return true;
}
int c=R[0];
for(int i=R[0];i!=0;i=R[i])if(S[i]<S[c])c=i;
del(c);
for(int i=D[c];i!=c;i=D[i]){
ans[d]=row[i];
for(int j=R[i];j!=i;j=R[j])del(con[j]);
if(dfs(d+1))return true;
for(int j=L[i];j!=i;j=L[j])restore(con[j]);
}
restore(c);
return false;
}
char ch[12][12];
int main(){
for(int i=0;i<9;i++)
scanf("%s",ch[i]);
init(9*9*4);
for(int i=0;i<9;i++)
for(int j=0;j<9;j++)
for(int v=0;v<9;v++)
if(ch[i][j]=='?'||ch[i][j]=='1'+v){
vector<int> Q;
Q.push_back(yama(Slot,i,j));
Q.push_back(yama(Row,i,v));
Q.push_back(yama(Con,j,v));
Q.push_back(yama(Sub,(i/3)*3+j/3,v));
ins(yama(i,j,v),Q);
}
if(dfs(0));
print();
return 0;
}

本文介绍了一种使用深度限制搜索(DLX)算法解决数独问题的方法。通过详细的代码示例展示了如何构建数独问题的数据结构,并利用DLX算法进行求解。该程序能够有效地找到数独的唯一解。
1215

被折叠的 条评论
为什么被折叠?



