网上看到一则新闻,江苏69岁农民3天破解“世界最难数独”,我也写了个程序破解该数独。
原报道截图如下:
原题如下:
运行结果:
#include<iostream>
#include<ctime>
using namespace std;
int p[9][9]; //存放九宫格数据
int z[][9] = { //分为九小宫
{0,0,0,1,1,1,2,2,2},
{0,0,0,1,1,1,2,2,2},
{0,0,0,1,1,1,2,2,2},
{3,3,3,4,4,4,5,5,5},
{3,3,3,4,4,4,5,5,5},
{3,3,3,4,4,4,5,5,5},
{6,6,6,7,7,7,8,8,8},
{6,6,6,7,7,7,8,8,8},
{6,6,6,7,7,7,8,8,8},
};
int r[9][10]; //r[i][j]为1时,第i行数字j(1~9)已放置
int c[9][10]; //c[m][n]为1时,第m列数字n(1~9)已放置
int d[9][10]; //d[x][y]为1时,第x宫数字y(1~9)已放置
int count; //解的个数
void input();
void output();
void init();
void search(int);
int main()
{
clock_t clockBegin, clockEnd; //用clock()来计时 毫秒
cout<<"输入:"<<endl;
input();
cout<<"输出:"<<endl;
clockBegin = clock(); //计时开始
init();
search(0);
clockEnd = clock(); //计时结束
cout<<"计算用时"<< clockEnd - clockBegin<<"ms"<<endl;
return 0;
}
void output(){
int i,j;
for(i = 0; i < 9; i++){
for(j = 0; j < 9; j++){
cout<<p[i][j]<<' ';
}
cout<<endl;
}
count++;
}
void init(){
int i,j,x;
for(i = 0; i < 9; i++){
for(j = 0; j < 9; j++){
x = p[i][j];
if(x == 0)
continue;
else{
r[i][x] = 1;
c[j][x] = 1;
d[z[i][j]][x] = 1;
}
}
}
}
void search(int cur)
{
if(count == 1)
return;
else if(cur == 81) //递归边界
output();
else{
int i,j,k,l;
i = cur / 9; //行号
j = cur % 9; //列号
if(p[i][j] != 0)
search(cur + 1);
else{
l = z[i][j];
for(k = 1; k <= 9; k++){
if(r[i][k]||c[j][k]||d[l][k]) //检查行、列和宫内是否冲突
continue;
p[i][j] = k;
r[i][k] = c[j][k] = d[l][k] = 1; //修改全局变量
search(cur + 1);
p[i][j] = r[i][k] = c[j][k] = d[l][k] =0;
}
}
}
}
void input(){
int i,j;
for(i = 0; i < 9; i++)
for(j = 0; j < 9;j++)
cin>>p[i][j];
}