簡體   English   中英

C中的數獨求解器無法正常工作

[英]Sudoku solver in C not working properly

我已經用C編寫了這個Sudoku求解器。但是它不能正常工作,有幫助嗎?

帶有示例輸入,例如

1 0 3 4 0 0 7 0 9
0 5 6 0 8 9 0 2 3
0 8 9 1 0 3 4 0 6
2 1 4 0 6 5 0 9 7
3 0 0 8 0 7 0 1 4
8 0 7 0 1 4 0 6 5
0 3 1 0 4 0 9 7 8
6 4 0 9 7 0 5 3 1
0 7 8 0 0 1 0 4 2

它給出輸出

1 2 3 4 5 6 7 8 9 
7 5 6 0 8 9 1 2 3 
0 8 9 1 2 3 4 5 6 
2 1 4 3 6 5 8 9 7 
3 9 5 8 0 7 2 1 4 
8 0 7 2 1 4 3 6 5 
5 3 1 6 4 2 9 7 8 
6 4 2 9 7 8 5 3 1 
9 7 8 5 3 1 6 4 2 

知道出了什么問題嗎?

#include<stdio.h>

int sudoku[9][9];

int check(int sudoku[][9], int row, int col, int sol)
{
    //checking in the grid
    int row_grid = (row/3) * 3;
    int col_grid = (col/3) * 3;

    int i, j;
    for(i=0; i<9; ++i)
    {
        if (sudoku[row][i] == sol)                             
            return 0;
        if (sudoku[i][col] == sol)                             
            return 0;
        if (sudoku[row_grid + (i%3)][col_grid + (i/3)] == sol) 
            return 0;
    }
    return 1;
}  


int main(void)
{
    int i,j,k;
    printf("enter the sudoku and enter 0 for unknown entries \n");
    for(i=0;i<9;i++)
    {
        for (j=0;j<9;j++)
        {
            scanf("%d",&sudoku[i][j]);
        }
    }    
    for(i=0;i<9;i++)
    {
        for (j=0;j<9;j++)
        {
            if(sudoku[i][j]==0)
            {
                for (k=1;k<=9;k++)
                {
                    if(check(sudoku,i,j,k)==1)
                    {
                        sudoku[i][j] = k;                   
                    }
                }               
            }
        }
    }

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

您不會以這種方式解決數獨問題。 您只需遍歷所有單元格,並為每個空單元格選擇可能存在的最大值。 顯然,這是不正確的,因為一個單元格中可能有多個變體。 並且您總是選擇最大的(因為for (k=...)循環中沒有break )。 有時您選擇了錯誤的數字,從而使數獨不一致。

更新:您所做的不是蠻力的,因為您不會遍歷所有可能的解決方案。 代替

if(check(sudoku,i,j,k)==1)
{
    sudoku[i][j] = k;                   
}

一定有類似的東西

if(check(sudoku,i,j,k)==1)
{
    tempSudoku = copy(sudoku); //pseudocode
    tempSudoku[i][j] = k;
    tryToSolveRecursively(tempSudoku);              
}

如果check()返回0,則存在不一致(對於某些空單元格,我們找不到單個可能的解決方案)。 因此,我們應該放棄此解決方案,然后回去嘗試其他方法(通過遞歸:))。 這不是唯一的選擇,但我只是希望它將為您指明正確的方向。

僅基於基本數獨規則的PS Brute Force解決方案將非常緩慢 相信我。 您需要其他試探法以減少搜索空間。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM