数独解法

为伊痴狂 2012-07-04 07:10:27
这两天看到他们在玩数独;
想自己写个程序解出来;
以下是自己的想法,不知道问题出在那里,或者有其他好的解法,推荐下,谢谢
typedef struct package{
char data[9][9];
char buf[9];
char num;
}PKG;

static char g_sData[9][9] = {0};
static PKG g_sPkg[81] = {0};

static int CheckData(char data[9][9], int num)
{
int i, j, k;
i = num / 9;
j = num % 9;

for(k=0; k<9; k++)
{
if(k == j || k==i)
continue;
if(data[i][k] == data[i][j])
break;
if(g_sData[k][j] == data[i][j])
break;
if(g_sData[i/3*3+k/3][j/3*3+k%3] == data[i][j])
break;
}
if(k< 9)
{
return 0;
}
return 1;
}
static void SaveData(char data[9][9])
{
int i=0;
FILE * fp = fopen("data.txt", "w+");
fseek(fp, 0, 2);
printf("sssssssssssssss\n");
fprintf(fp, "/////////////////////////////////////////////////\n");
for(i=0; i<9; i++)
{
fprintf(fp, " %d %d %d %d %d %d %d %d %d \n",
data[i][0], data[i][1], data[i][2], data[i][3], data[i][4], data[i][5], data[i][6], data[i][7], data[i][8]);
}
fclose(fp);
}
static int Calc(int inx)
{
char data[9][9] = {0};
char i,k=0;
printf("num:%d, inx:%d\n", g_sPkg[inx].num, inx);
for(i=0; i< g_sPkg[inx].num; i++)
printf(" %d ", g_sPkg[inx].buf[i]);
printf("\n");
for(k=0; k< g_sPkg[inx].num; k++)
{
memcpy((char *)data,(char *)(g_sPkg[inx].data), sizeof(data));
data[inx/9][inx%9] = g_sPkg[inx].buf[k];
if(CheckData(data, inx) ==0)
{
continue;
}
if(inx == 80)
{
SaveData(data);
continue;
}
memcpy(g_sPkg[inx+1].data, data, sizeof(data));
Calc(inx+1);
}
}
static int FillData(char data[9][9])
{
int num = 0;
char tmp[9] = {0};
int i=0,j=0,k=0,l;
//char data[9][9] = {0};

for(i=0; i<9; i++)
{
for(j=0; j<9; j++)
{
memset(tmp, 0, sizeof(tmp));
num = 0;
if(data[i][j] > 0)
{
tmp[num] = data[i][j];
num++;
}
else
{
for(k=1; k<10; k++)
{
for(l=0; l<9; l++)
{
if(data[i][l]>0 && data[i][l] == k)
break;
if(data[l][j]>0 && data[l][j]==k)
break;
if( data[i/3*3+l/3][j/3*3+l%3]>0 && data[i/3*3+l/3][j/3*3+l%3] == k)
break;
}
if(l>=9 && k<10)
{
tmp[num] = k;
num++;
}
}
}
g_sPkg[i*9+j].num = num;
memcpy((g_sPkg[i*9+j].buf), tmp, sizeof(tmp));
/*
printf("a[%d][%d]:%d,num:%d\n",i,j,data[i][j], g_sPkg[i*9+j].num);
for(k=0; k<num; k++)
printf(" %d ", g_sPkg[i*9+j].buf[k]);
printf("\n");
*/
}
}
}
int main(int argc, char *argv[])
{
char data[9][9] = {{0,0,6, 0,1,0, 0,4,0},
{0,0,0, 4,0,0, 0,0,5},
{3,0,0, 5,0,0, 0,0,8},
{0,0,2, 8,0,5, 0,7,0},
{0,0,8, 0,0,2, 1,5,0},
{0,5,0, 0,7,0, 9,0,0},
{9,0,0, 0,0,4, 0,0,3},
{2,0,0, 0,0,6, 0,0,0},
{0,6,0, 0,5,0, 4,0,0}};
FillData(data);
Calc(0);
SaveData(data);
return 0;
}
...全文
169 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧