c语言编写求解数独

来源:互联网 发布:帝江网络 编辑:程序博客网 时间:2024/06/05 11:14

大一的第一个解决问题的程序,递归操作,很久才搞定这个程序。--


      输入格式为9*9的 数字矩阵 如果没有填入数字则用0代替,用递归求解 对每个格子进行1 - 9 的尝试填入  递归操作 直到81个格子全部填入成功,输出第一个解。如果填某个格子发现不正确的时候退出这层递归返回上层。

代码如下

</pre><pre name="code" class="objc">#include <stdio.h>#define FOR(i, x, y) for(i = x; i <= y; ++i)int result = 1;void start (int a[9][9],int n);int check(int a[9][9],int i,int j, int k);void output(int a[9][9]);int main(){    int a[9][9];    int i,j;        FOR(i, 0, 8)    FOR(j, 0, 8)    scanf("%d",&a[i][j]);    start (a,0);    return 0;}void output(int a[9][9]){    result--; //只需要输出第一个解    int i ,j;    FOR(i, 0, 8)    {    FOR(j, 0, 8)        printf("%d ",a[i][j]);        printf("\n");    }}int check (int a[9][9],int i,int j,int k){    int i1,j1,p,q;    FOR(p, 0, 8)    if (a[p][j] == k)        return 0;    FOR(q, 0, 8)    if (a[i][q] == k)  //检测行与列        return 0;    i1 = i / 3 * 3;    j1 = j / 3 * 3;  //检测九宫格    FOR(p, i1, i1 + 2)    FOR(q, j1, j1 + 2)    if (a[p][q] == k)        return 0;    return 1;}void start (int a[9][9], int n){    int r[9][9],p,q;    FOR(p, 0, 8)    FOR(q, 0, 8)    r[p][q] = a[p][q];    int i = n / 9;    int j = n % 9;    if (r[i][j] != 0)    {        if (n == 80)            output(r);        else start(r,n+1);    }    else if (a[i][j] == 0 && result == 1)    {        FOR(p, 1, 9)        {         if (check (r, i, j, p))         {             r[i][j] = p;             if (n == 80)                 output(r);            else start (r , n+1);         }        }            }}


1 0
原创粉丝点击