您的位置:首页 > 编程语言 > C语言/C++

数独程序

2016-03-09 14:08 435 查看
#include <stdio.h>
#include <stdlib.h>

#define NUM 9

void solution(int [][NUM]);
//打印数独
void mydisplay(int[][NUM]);
//找到当前数组中的第一个空
void findfistemptyposition(int shudu[][NUM],int*,int*);
//p指向一个数组,{1,2,3,4,5,6,7,8,9},将指定空缺中不可填的数字设置为零
void findpossiblenum(int shudu[][NUM],int *,int,int);

int main(void)
{
//用二维数组定义数独,其中为零的地方是需要填写数字的地方
int shudu[NUM][NUM]=
{
{7,8,1,6,0,2,9,0,5},
{9,0,2,7,1,0,0,0,0},
{0,0,6,8,0,0,0,1,2},
{2,0,0,3,0,0,8,5,1},
{0,7,3,5,0,0,0,0,4},
{0,0,8,0,0,9,3,6,0},
{1,9,0,0,0,7,0,8,0},
{8,6,7,0,0,3,4,0,9},
{0,0,5,0,0,0,1,0,0},
};

solution(shudu);

return 0;
}

void solution(int shudu[][NUM])
{
//寻找当前数独第一个空缺位置
int firstemptyline=NUM,firstemptycolumn=NUM;
findfistemptyposition(shudu,&firstemptyline,&firstemptycolumn);
//如果找不到空缺,即数独已经填满,则打印数独
if(firstemptyline==NUM&&firstemptycolumn==NUM)
{
printf("满足要求的数独为:\n");
mydisplay(shudu);
//只是用于程序暂停,无实际意义
getchar();
}
else
{
//找到该空缺可以填的数字
int possbilenum[NUM]={1,2,3,4,5,6,7,8,9};
int *p=possbilenum;
findpossiblenum(shudu,p,firstemptyline,firstemptycolumn);

int i;
for(i=0;i<NUM;i++)
{
if(possbilenum[i]!=0)
{
shudu[firstemptyline][firstemptycolumn]=possbilenum[i];
solution(shudu);
}
}
}
shudu[firstemptyline][firstemptycolumn]=0;
}

void mydisplay(int shudu[][NUM])
{
int i=0,j=0;
for(i=0;i<NUM;i++)
{
for(j=0;j<NUM;j++)
{
printf("%d  ",shudu[i][j]);
}
printf("\n");
}
return;
}

void findfistemptyposition(int shudu[][NUM],int *pline,int *pcolumn)
{
int i,j;
for(i=0;i<NUM;i++)
{
for(j=0;j<NUM;j++)
{
if(shudu[i][j]==0)
{
*pline=i;
*pcolumn=j;
return;
}
}
}
*pline=NUM;
*pcolumn=NUM;
return;
}

void findpossiblenum(int shudu[][NUM],int *p,int pline,int pcolumn)
{
int i=0,j=0;
//不能与所在行重复
for(i=0;i<NUM;i++)
{
if(shudu[pline][i]!=0)
{
p=p+shudu[pline][i]-1;
*p=0;
p=p-shudu[pline][i]+1;
}
}
//列检查
for(i=0;i<NUM;i++)
{
if(shudu[i][pcolumn]!=0)
{
p=p+shudu[i][pcolumn]-1;
*p=0;
p=p-shudu[i][pcolumn]+1;
}
}
//所在小方格检查
for(i=(pline/3)*3;i<=(pline/3)*3+2;i++)
{
for(j=(pcolumn/3)*3;j<=(pcolumn/3)*3+2;j++)
{
if(shudu[i][j]!=0)
{
p=p+shudu[i][j]-1;
*p=0;
p=p-shudu[i][j]+1;
}
}
}
return;
}


请大家指教。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  数独 C语言