用c语言写一个简易数独的思路。要代码

#include<stdio.h>

int?num[9][9],?xy[9][9];

int?check(int?x,?int?y)?{

int?i,?m,?n;

for(i?=?0;?i?<?9;?i++)

if?((xy[x][y]?==?xy[i][y]&&i?!=?x)||(xy[x][y]?==?xy[x][i]&&i?!=?y))

return?0;

for(i?=?0,?m?=?x?/?3?*?3,?n?=?y?/?3?*?3;?i?<?9;?i++)

if?(xy[x][y]?==?xy[m?+?i?/?3][n?+?i?%?3]&&m?+?i?/?3?!=?x&&n?+?i?%?3?!=?y)

return?0;

return?1;

}

void?search(int?x,?int?y)?{

if?(x?==?9)

for(x?=?0;?x?<?9;?x++)?{

for(y?=?0;?y?<?9;?y++)

printf("%d?",?xy[x][y]);

printf("\n");

}

else?if?(num[x][y])

search(x?+?(y?+?1)?/?9,?(y?+?1)?%?9);

else

for(xy[x][y]?=?1;?xy[x][y]?<=?9;?xy[x][y]++)

if?(check(x,?y))

search(x?+?(y?+?1)?/?9,?(y?+?1)?%?9);

return;

}

int?main()?{

int?i,?j;

for(i?=?0;?i?<?9;?i++)

for(j?=?0;?j?<?9;?j++)?{

scanf("%d",?&num[i][j]);

xy[i][j]?=?num[i][j];

}

search(0,?0);

return?0;

}

输入为9行9列整数,已知的整数填写对应的数字,尚待计算的未知数字填写0。

该代码的思路很简单,就是从第一行第一列开始依次填入数字,检查是否是在同一行、同一列、同一宫有没有填入重复数字,如果没有就继续填入下一个数字,如果有就返回。

虽然效率稍低,但原理简单、表述直白、易于理解,更有效率的代码是使用十字链表完成,如有兴趣可继续深入