如果前面6个连续仔细看了的话,再做一些简单的推理,是可以把这个数独的程序编写出来的了。并不需要看全部源码。源码在其他地方也很容易找到,不过,不同的解决方式会不一样。看过一些说明,说可以使用递归方法解决的。本贴就vip可见吧。
#include <stdio.h>
#include <stdlib.h>
void prtsdk(int a[9][9]){
int i,j;
for(i=0;i<9;i++){
for(j=0;j<9;j++){
if(a[i][j]==0)printf(" ");else printf("%d",a[i][j]);
if((j%3)!=2)printf(" ");
if(j==2||j==5)printf(" | ");
}
if((i==2)||(i==5))printf("\n-----------------------");
printf("\n");
}
printf("\n");
return ;
}
//初始检测,全部一起检,true表示有重复值
bool chkinit(int q,int sdk[9][9]){
bool blt=false;
int i,j,ii,jj,iit,jjt,iip,jjq;
for(i=0;i<9;i++){
for(j=0;j<9;j++){
if(sdk[i][j]!=0){//未设置,不用比较;
for(ii=0;ii<9;ii++){//横向
if((ii!=i)&&(sdk[i][j]==sdk[ii][j])){
blt=true;
if(q==0)printf("有重复值(%d,%d)=%d=(%d,%d)=%d,错误!\n",i+1,j+1,sdk[i][j],ii+1,j+1,sdk[ii][j]);
break;
}
}
if(blt)break;
for(jj=0;jj<9;jj++){//竖向
if((jj!=j)&&(sdk[i][j]==sdk[i][jj])){
blt=true;
if(q==0)printf("有重复值(%d,%d)=%d=(%d,%d)=%d,错误!\n",i+1,j+1,sdk[i][j],i+1,jj+1,sdk[i][jj]);
break;
}
}
if(blt)break;
iit=i/3;
jjt=j/3;
for(int iiq=0;iiq<3;iiq++){
for(int jjp=0;jjp<3;jjp++){
if((iit*3+iiq!=i)&&(jjt*3+jjp!=j)){
if(sdk[iit*3+iiq][jjt*3+jjp]==sdk[i][j]){
blt=true;
if(q==0)printf("同一小格内有重复值(%d,%d)=%d=(%d,%d)=%d,错误!\n",i+1,j+1,sdk[i][j],iit*3+iiq+1,jjt*3+jjp+1,sdk[iit*3+iiq][jjt*3+jjp]);