//数独问题
# include <iostream>
# include <cstring>
# include <fstream>
using namespace std;
int map[9][9];
void display(){
int i,j;
for(i=0;i<9;i++){
for(j=0;j<9;j++){
cout<<map[i][j]<<" ";
}
cout<<endl;
}
}
bool check(int c){
int x,y,i,j,dx,dy;
x=c/9;
y=c%9;
for(i=0;i<9;i++){
if(map[i][y]==map[x][y]&&x!=i)
return false;
}
for(j=0;j<9;j++){
if(map[x][j]==map[x][y]&&y!=j)
return false;
}
dx=x/3*3;
dy=y/3*3;
for(i=dx;i<dx+3;i++){
for(j=dy;j<dy+3;j++){
if(map[i][j]==map[x][y]&&i!=x&&j!=y)
return false;
}
}
return true;
}
void backtrack(int n){
int x,y;
if(n==81){
//if(check(80))
display();
cout<<endl;
return ;
}
x=n/9;
y=n%9;
if(map[x][y]==0){
for(int k=1;k<=9;k++){
map[x][y]=k;
if(check(n)){
backtrack(n+1);
}
map[x][y]=0; //请注意此处应当清零,如果不清零下一次就没有办法触发!!!
}
map[x][y]==0;
return;
}
else{
backtrack(n+1);
}
}
int main(){
int i,j;
fstream in("shudu.txt");
for(i=0;i<9;i++){
for(j=0;j<9;j++){
in>>map[i][j];
}
}
backtrack(0);
return 0;
}提交时,注意选择所期望的编译器类型。
用回朔法求数独的运算理解上是挺简单的,写起来的时候注意一下几个要点,就不会有什么问题了,下面是我的代码,没有优化过,如果有什么不妥的地方请评论或者私信
原文:http://blog.csdn.net/haoge9551/article/details/44513945