数独是一个非常有名的游戏。整个是一个9X9的大宫格,其中又被划分成9个3X3的小宫格。要求在每个小格中放入1-9中的某个数字。要求是:每行、每列、每个小宫格中数字不能重复。 现要求用计算机求解数独。(50分)
输入描述:
输入9行,每行为空格隔开的9个数字,为0的地方就是需要填充的数字。
输出描述:
输出九行,每行九个空格隔开的数字,为解出的答案。
输入
0 9 0 0 0 0 0 6 0 8 0 1 0 0 0 5 0 9 0 5 0 3 0 4 0 7 0 0 0 8 0 7 0 9 0 0 0 0 0 9 0 8 0 0 0 0 0 6 0 2 0 7 0 0 0 8 0 7 0 5 0 4 0 2 0 5 0 0 0 8 0 7 0 6 0 0 0 0 0 9 0
输出
7 9 3 8 5 1 4 6 2 8 4 1 2 6 7 5 3 9 6 5 2 3 9 4 1 7 8 3 2 8 4 7 6 9 5 1 5 7 4 9 1 8 6 2 3 9 1 6 5 2 3 7 8 4 1 8 9 7 3 5 2 4 6 2 3 5 6 4 9 8 1 7 4 6 7 1 8 2 3 9 5
#include <iostream>
using namespace std;
int a[9][9];
bool sign=false;
bool Check(int key,int n) {
for(int i=0;i<9;i++) { //查行
int j=n/9;
if(a[j][i]==key)
return false;
}
for(int i=0;i<9;i++) { //查列
int j=n%9;
if(a[i][j]==key)
return false;
}
int x=n/9/3*3; //n所在小九宫开头列坐标
int y=n%9/3*3; //n所在小九宫开头行坐标
for(int i=x;i<x+3;i++) //查该数所在的小正方形
for(int j=y;j<y+3;j++)
if(a[i][j]==key)
return false;
return true; //符合所有的条件
}
int DFS(int n) { //从0到80 //是9*9的大正方形
if(n>80) {
sign=true;
return 0;
}
if(a[n/9][n%9]!=0)
DFS(n+1); //循环查找
else {
for(int i=1;i<=9;i++) { //1-9的暴力测试
if(Check(i,n)) {
a[n/9][n%9]=i;
DFS(n+1);
if(sign)
return 0;
a[n/9][n%9]=0; //当不正确时,恢复初始状态,方便后面
}
}
}
return 0;
}
int main() {
for(int i=0;i<9;i++) //输入
for(int j=0;j<9;j++)
cin>>a[i][j];
DFS(0);
for(int i=0;i<9;i++) //输出
for(int j=0;j<9;j++) {
cout<<a[i][j];
if(j!=8)
cout<<" ";
else
cout<<endl;
}
return 0;
}