程序思想:搜索的回溯算法。
程序下载:数独程序 注意:请严格按输入文件格式,否则不能得到正确答案。
程序说明:Dos程序,绝无病毒。如程序有问题,请务必在此报错,谢谢。
将程序和输入文件放到同一文件夹,再运行程序。
输入文件:in.txt 0表示要填的空
0 0 7 0 6 9 0 2 1
0 8 0 5 0 0 6 0 7
2 0 0 4 0 0 0 9 0
0 2 4 0 0 0 0 0 5
6 0 0 0 0 0 0 0 2
1 0 0 0 0 0 7 6 0
0 9 0 0 0 8 0 0 6
8 0 2 0 0 5 0 3 0
5 1 0 3 9 0 2 0 0
输出文件:ans.txt 第一组是输入数据,以后的是答案,理论上有几组就能输出几组,无解就只有第一组数据。
0 0 7 0 6 9 0 2 1
0 8 0 5 0 0 6 0 7
2 0 0 4 0 0 0 9 0
0 2 4 0 0 0 0 0 5
6 0 0 0 0 0 0 0 2
1 0 0 0 0 0 7 6 0
0 9 0 0 0 8 0 0 6
8 0 2 0 0 5 0 3 0
5 1 0 3 9 0 2 0 0
3 4 7 8 6 9 5 2 1
9 8 1 5 3 2 6 4 7
2 6 5 4 7 1 8 9 3
7 2 4 9 8 6 3 1 5
6 3 9 1 5 7 4 8 2
1 5 8 2 4 3 7 6 9
4 9 3 7 2 8 1 5 6
8 7 2 6 1 5 9 3 4
5 1 6 3 9 4 2 7 8
源代码如下:
#include<iostream>
#include<fstream>
using namespace std;
ifstream fin("in.txt");
ofstream fout("ans.txt");
int b[9][9],h[9][10]={0},l[9][10],k[9][10];
int q=0,w=0;
int p(int m,int n)
{
if(m<=2&&n<=2)
return 0;
if(m<=2&&m>=0&&n<=5&&n>=3)
return 1;
if(m<=2&&m>=0&&n<=8&&n>=6)
return 2;
if(m<=5&&m>=3&&n<=2&&n>=0)
return 3;
if(m<=5&&m>=3&&n<=5&&n>=3)
return 4;
if(m<=5&&m>=3&&n<=8&&n>=6)
return 5;
if(m<=8&&m>=6&&n<=2&&n>=0)
return 6;
if(m<=8&&m>=6&&n<=5&&n>=3)
return 7;
if(m<=8&&m>=6&&n<=8&&n>=6)
return 8;
}
void go(int m,int n)
{
int i;
if(b[m][n]==0)
{
for (i=1;i<=9;i++)
{
if((h[m]==0&&l[n]==0)&&k[p(m,n)]==0)
{
b[m][n]=i;
h[m]=1;
l[n]=1;
k[p(m,n)]=1;
if(n==8)
{
if(m==8)
for(q=0,w=0;q<9;)//fout
{
fout<<b[q][w]<<" ";
if (w==8)
{
if(q==8)
{
fout<<endl<<endl;
break;
}
else
{
q=q+1;
w=0;
fout<<endl;
}
}
else
w++;
}//end fout
else
go(m+1,0);
}
else
go(m,n+1);
b[m][n]=0;
h[m]=0;
l[n]=0;
k[p(m,n)]=0;
}
}
}
else
{
if(n==8)
{
if(m==8)
{
for(q=0,w=0;q<9;)//fout
{
fout<<b[q][w]<<" ";
if (w==8)
{
if(q==8)
{
fout<<endl<<endl;
break;
}
else
{
q=q+1;
w=0;
fout<<endl;
}
}
else
w++;
}//end fout
}
else
go(m+1,0);
}
else
go(m,n+1);
}
}
void main()
{
int i,j,a;
for(i=0,j=0;;)
{
fin>>b[j];
a=b[j];
if(b[j]!=0)
{
k[p(i,j)][a]=1;
h[a]=1;
l[j][a]=1;
}
if(j==8)
{
if(i==8)
break;
else
{
i++;
j=0;
}
}
else
j++;
}
for(q=0,w=0;q<9;)//fout
{
fout<<b[q][w]<<" ";
if (w==8)
{
if(q==8)
{
fout<<endl<<endl;
break;
}
else
{
q=q+1;
w=0;
fout<<endl;
}
}
else
w++;
}//end fout
go(0,0);
fin.close();
fout.close();
}
//程序结束