#include<stdio.h>
int e=0;
int s1;//宫格
int s2;//s2宫格
#define N 64 //N宫格
int sd[N][N];//初盘
//输出打印
void prin(int arr[N][N]){
for(int i=0;i<s2;i++){
for(int j=0;j<s2;j++){
if(j%s1==0 && j!=0)
printf("|");
printf(" %d ",arr[i][j]);
}
printf("\n");
if((i+1)%s1==0 && (i+1)!=s2){
for(int d=0;d<s2+s1-1;d++)
if(d==s1+(s1+1)*(d/(s1+1)))
printf("+");
else
printf("---");
printf("\n");
}
}
}
//判断
int pd(int js[N][N],int i,int j,int n){
for(int k=0;k<s2;k++){
//判断该数字是否符合
bool flag=false;
if(js[i][k]==n||js[k][j]==n||js[i/s1*s1+k%s1][j/s1*s1+k/s1]==n){
//printf("(%d,%d)不符合%d",i,j,n);
return false;
}
}
return true;
}
//计算
void jisuan(int arr[N][N]){
int js[N][N];
//赋值
for(int i=0;i<s2;i++){
for(int j=0;j<s2;j++){
js[i][j]=arr[i][j];
}
}
//开始计算
for(int i=0;i<s2;i++){
for(int j=0;j<s2;j++){
int temp=js[i][j];
if(js[i][j]==0){ //查找可填数字的位置
for(int n=1;n<s2+1;n++){ //可能的数字
if(pd(js,i,j,n)){
//printf("(%d,%d)=%d\n",i,j,n);
js[i][j]=n;
jisuan(js);
js[i][j]=temp;
}
}
return;
}
if(i*j==(s2-1)*(s2-1)){
e++;
printf("\n第%d种解:\n",e);
prin(js);
return;
}
}
}
}
void readSD(){
/* 打开文件用于读写 */
FILE *fp= fopen("1.txt", "r");
/* 读取并显示数据 */
for(int i=0;i<s2;i++)
for(int j=0;j<s2;j++)
fscanf(fp,"%d",&sd[i][j]);
fclose(fp);
}
int main(){
printf("请输入你要求解数独类型:n*n(2、3)\n");
do{
printf("n=");
scanf("%d",&s1);
}while(s1<2 || s1>3);
s2=s1*s1;
readSD();
printf("初始盘为:\n");
prin(sd);
jisuan(sd);
printf("\n");
if(e==0)
printf("此题无解\n");
else
printf("此题共%d解\n",e);
return 0;
}
对于txt读取有个小要求,就是每个数字之间要打一个空格符,或者换行符
|