题目描述
数独是一个我们都非常熟悉的经典游戏,运用计算机我们可以很快地解开数独难题,现在有一些简单的数独题目,请编写一个程序求解。
IDEA
数独,即9*9的矩阵,填入1-9的数字,让每一行,每一列,每一宫(共9个宫)的数字不重复。
用动态规划法。深度搜索,从左到右,从上到下一次为,填入数n(n=0,1,...,80)
检查n所在的行,列,宫是否正确。
注意n对应的坐标为(n/9,n%9),宫的左上角坐标为(n/9/3*3,n%9/3*3)
CODE
没有全部测试用例,不知为何。。。但是思路是对的哦!
#include<iostream>
#include<vector>
using namespace std;
bool flag=false;
vector<vector<int> > num;
void Input(){
for(int i=0;i<9;i++){
for(int j=0;j<9;j++){
cin>>num[i][j];
}
}
}
void Output(){
for (int i=0;i<9;i++){
for (int j=0;j<9;j++){
if(j==0){
cout<<num[i][j];
}else{
cout<<" "<<num[i][j];
}
}
cout<<endl;
}
}
int Check(int n, int key){
//check n所在横行
for(int y=0;y<9;y++){
int x=n/9;
if(num[x][y]== key)
return 0;
}
//check n所在纵列
for(int x=0;x<9;x++){
int y=n%9;
if(num[x][y]==key)
return 0;
}
//check n所在的宫
int x=n/9/3*3;//n所在宫的左顶点坐标
int y=n%9/3*3;
for(int i=x;i<x+3;i++){
for(int j=y;j<y+3;j++){
if(num[i][j]==key)
return 0;
}
}
return 1;
}
void DFS(int n)
{
if(n>80){//总共81个点
flag=1;
return;
}
//第n个点的坐标(x,y)
int x=n/9,y=n%9;
if(num[x][y]!=0){//如果该点已经填入数字,则检查下一个点
DFS(n+1);
}else{
for(int i=1;i<=9;i++){//否则给该点填数。从1到9尝试
if(Check(n,i)){
num[x][y]=i;
DFS(n+1);
if(flag)
return;
num[x][y]=0;
}
}
}
}
int main(){
num.resize(9,vector<int>(9));
//freopen("input.txt","r",stdin);
Input();
DFS(0);
Output();
return 0;
}