2、判断数独是否成立。
这分两个内容。第1个内容是在初始输入结束后,对输入的数据进行检测。特点是对所有非0的数值进行验证。
第2个内容是在解题过程中,对输入的内容进行判断是否符合数独的要求。特点是只对单一值进行判断。其中第1个是可以覆盖第2个的,但第2个的运算过程要少很多。虽然这个程序总的体量不大,随便的单机都能解决。但能少计算的部分就少计算吧。
具体代码如下:
//初始检测,全部一起检,true表示有重复值
bool chkinit(int q,int sdk[9][9]){
//q取0,表示要说明具体原因,如不需要展示原因,则将q取其他值
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]);
break;
}
}
}
}
if(blt)break;
}
}
if(blt)break;
}
return blt;
}
//解题过程检测,只检一个,true表示有重复值
bool chk(int q,int i,int j,int sdk[9][9]){
bool blt=false;
int ii,jj,iit,jjt,iip,jjq;
if(sdk[i][j]==0) {//未设置,不用比较;
blt=false;
return blt;
}
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;
}
}
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;
}
}
iit=i/3;
jjt=j/3;
//printf("i=%d,j=%d,iit=%d,jjt=%d\n",i,j,iit,jjt);
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]);
break;
}
}
}
}
return blt;
}