1、初始输入部分
关于初始输入部分,为了简便输入,结合数独的特点,采用3位数连续输入的方式来初始输入,比如,输入123表示第1行第2列的初始值为3,输入798表示第7行第9列的初始值为8。如果输入错误了,要进行清除,则采用初始值置0的方式来处理。
同时对错误的输入进行简单甄别(完全的甄别错误输入,是一个比较麻烦的事情,不做完整处理)。
代码如下:
//初始输入
bool blinitfail=true;
//输入初始值
do{
int x=0,y=0,i=0,j=0,k=0;
printf("初始值输入说明:\n输入三位数,分别表示行数、列数,初始值,最后回车结束:\n");
printf("如输入'123',表示第1行第2列的初始数值为3\n");
printf("如需删除已设置初始值,可将该处设置为0值。如'130'表示将第1行第3列初始值删除\n");
printf("如果输入初始值结束,请输入(100)\n");
while(1){
scanf("%d",&j);
if(j==100){
printf("初始值输入结束!以下列出已设置内容\n\n");
prtsdk(sdk);
printf("是否需要更改,如需更改,请输入0,其他字符则自动验证数独,无误后开始解题\n");
scanf("%d",&k);
if(k!=0)break;else {
printf("现在可以继续录入初始值\n要删除初始值可设置该处为0\n");
continue;
}
}
x=j/100;
y=(j%100)/10;
i=j%10;
if((x<10)&&(x>0)&&(y<10)&(y>0)&&(i<10)&&(i>=0)){
sdk[x-1][y-1]=i;
if(i==0)printf("已经清除(%d,%d)处的初始值\n",x,y);
else printf("已设置(%d,%d)=%d\n\n",x,y,sdk[x-1][y-1]);
}else{
printf("\n数据不符合要求,本次未设置初始值。\n");
}
printf("继续输入初始值或结束(输入100)\n");
}
//验证初始值是否满足要求
bool blt=false;
blt=chkinit(0,sdk);
if(blt==true){
blinitfail=true;
printf("初始数独有误,重置全部为0\n\n");
for(i=0;i<9;i++){
for(j=0;j<9;j++){
sdk[i][j]=0;
}
}
printf("请重新输入初始数据\n");
}else{
printf("初始值验证通过,需解题数独为\n");
prtsdk(sdk);
blinitfail=false;
}
//prtsdk(sdk);
blt=false;//恢复blt
}while(blinitfail);
//初始值输入结束