您的位置:首页 > 编程语言 > C语言/C++

简单数独求解算法(C语言)

2014-07-06 21:51 459 查看
#include <stdio.h>

int findvalue(int sudoku[9][9], int i, int j);

int main(void)
{
    int sudoku[9][9] = {{0, 3, 0, 0, 0, 7, 0, 0, 0},
                        {1, 2, 5, 0, 0, 9, 4, 0, 0},
                        {0, 7, 9, 1, 0, 0, 0, 3, 0},
                        {0, 0, 6, 0, 8, 0, 0, 9, 1},
                        {0, 0, 0, 9, 5, 1, 0, 0, 0},
                        {9, 1, 0, 0, 7, 0, 5, 0, 0},
                        {0, 9, 0, 0, 0, 5, 7, 4, 0},
                        {0, 0, 8, 7, 0, 0, 2, 6, 9},
                        {0, 0, 0, 4, 0, 0, 0, 5, 0} };

    int i, j, temp, empty = 0;
    for(i=0; i<9; i++)
    {
        for(j=0; j<9; j++)
            if(sudoku[i][j]==0)
                empty++;
    }

    printf("%d\n", empty);
    while(empty)
    {
        for(i=0; i<9; i++)
        {
            for(j=0; j<9; j++)
            {
                if(sudoku[i][j]==0)
                {
                    temp = findvalue(sudoku, i, j);
                    if(temp==-1)
                    {
                        printf("无解!\n");
                        return 1;
                    }
                    sudoku[i][j] = temp;
                    if(temp!=0) empty--;
                }
            }
        }
    }

    for(i=0; i<9; i++)
    {
        for(j=0; j<9; j++)
            printf("%d ", sudoku[i][j]);
        printf("\n");
    }

    return 0;
}

int findvalue(int sudoku[9][9], int i, int j)
{
    int m, n, k;
    int temp[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
    for(k=1; k<10; k++)
    {
        if(temp[sudoku[i][k-1]]==0)
            temp[sudoku[i][k-1]] = sudoku[i][k-1];
        if(temp[sudoku[k-1][j]]==0)
            temp[sudoku[k-1][j]] = sudoku[k-1][j];
    }
    for(m=0; m<3; m++)
        for(n=0; n<3; n++)
            if(temp[sudoku[i/3*3+m][j/3*3+n]]==0)
                temp[sudoku[i/3*3+m][j/3*3+n]] = sudoku[i/3*3+m][j/3*3+n];

    for(k=1; k<10; k++)
        if(temp[k]==0)
        {
            temp[0]++;
            m=k;
        }

    if(temp[0]==0)
        return -1;
    else if(temp[0]==1)
        return m;
    else
        return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: