用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。
该代码的思路很简单,就是从第一行第一列开始依次填入数字,检查是否是在同一行、同一列、同一宫有没有填入重复数字,如果没有就继续填入下一个数字,如果有就返回。
虽然效率稍低,但原理简单、表述直白、易于理解,更有效率的代码是使用十字链表完成,如有兴趣可继续深入