本文利用回溯法求解数独,程序运行后输入9X9数独矩阵,数字0代表未填的数字,数字与数字之间以空格间隔
#include <iostream>
using namespace std;
int A[9][9]={0};
int C=0;
int s[81]={0};//标记未填写的空格
int row[9][10]={0};//行检测
int col[9][10]={0};//列检测
int p[9][10]={0};//块检测
int is=0;
void backtrak(int t){//回溯法解数独遍历
if(t>C){
int i,j;
if(is<10){
for(i=0;i<9;i++){
for(j=0;j<9;j++)
cout<<A[i][j]<<",";
cout<<endl;
}
cout<<"*******************"<<endl;
}
is++;
}
else{
int i;
int x,y,z;
x=s[t]/9;
y=s[t]%9;
z=x/3*3+y/3;
for(i=1;i<10;i++){
A[x][y]=i;
if(row[x][i]==0&&col[y][i]==0&&p[z][i]==0){
row[x][i]=1;
col[y][i]=1;
p[z][i]=1;
backtrak(t+1);
row[x][i]=0;
col[y][i]=0;
p[z][i]=0;
}
}
}
}
int main()
{
int i,j;
int a;
for(i=0;i<9;i++)
for(j=0;j<9;j++){
cin>>a;
row[i][a]=1;
col[j][a]=1;
p[i/3*3+j/3][a]=1;
if(a==0)
s[++C]=i*9+j;
A[i][j]=a;
}
backtrak(1);
cout<<"解法"<<is<<"种";
return 0;
}