C语言程序怎么解决数独,数独解法解决方法

当前位置:我的异常网» C语言 » 数独解法解决方法

数独解法解决方法

www.myexceptions.net  网友分享于:2013-11-21  浏览:47次

数独解法

这两天看到他们在玩数独;

想自己写个程序解出来;

以下是自己的想法,不知道问题出在那里,或者有其他好的解法,推荐下,谢谢

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

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;

}

------解决方案--------------------

http://topic.csdn.net/u/20120703/08/acedb6fb-46a7-4005-b375-21fdc452030c.html

你可以参考一下

文章评论

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值