簡體   English   中英

C 中的數獨遞歸回溯輔助

[英]Sudoku Recursive Backtrack Aid in C

我對編碼比較陌生,遞歸一直是我的眼中釘。 我需要幫助實現回溯遞歸。

這是我的示例代碼(假設所有輔助函數都正常工作 [並且他們確實如此])

void solve_sudoku(char sudoku[9][9])
{
    if (contains_empty_cell(sudoku) == 1)
    {
        for (int y = 0; y < 9; y++)
        {
            for (int x = 0; x < 9; x++)
            {
                if (sudoku[y][x] == 0)
                {
                    for (int i = 1; i <= 9; i++)
                    {
                        sudoku[y][x] = i;
                        if (is_valid_column(sudoku, y, x) == 1 &&
                            is_valid_row(sudoku, y, x) == 1 &&
                            is_valid_sub_box(sudoku, y, x) == 1)
                        {
                            solve_sudoku(sudoku);
                        }
                    }
                    if (sudoku[y][x] == 9)
                    {
                        sudoku[y][x] = 0;
                        return;
                    }
                }
            }
        }
    }
}

我認為你很接近。 主要問題是您如何處理解決方案。 您似乎試圖用if (sudoku[y][x] == 9)來處理它。 但那是不正確的。

選項 1 是在找到解決方案后退出。 solve_sudoku()返回一個值來表明這一點。 解決方案將是最外層調用solve_sudoku()之后的最終結果:

int solve_sudoku(char sudoku[9][9])
{
    if (contains_empty_cell(sudoku) != 0)
    {
        return 1; // sudoku completely filled in, i.e. solution found
    }

    for (int y = 0; y < 9; y++)
    {
        for (int x = 0; x < 9; x++)
        {
            if (sudoku[y][x] == 0)
            {
                for (int i = 1; i <= 9; i++)
                {
                    sudoku[y][x] = i;
                    if (is_valid_column(sudoku, y, x) == 1 &&
                        is_valid_row(sudoku, y, x) == 1 &&
                        is_valid_sub_box(sudoku, y, x) == 1)
                    {
                        if (solve_sudoku(sudoku) == 1)
                        {
                            return 1; // exit if solution found
                        }
                    }
                }
                // restore empty cell
                sudoku[y][x] = 0;
            }
        }
    }

    return 0;
}

一個數獨可以有多種解法。 所以選項 2 是打印每個找到的解決方案,然后繼續:

void solve_sudoku(char sudoku[9][9])
{
    if (contains_empty_cell(sudoku) == 0)
    {
        // Sudoku completely filled in, print solution
        print_solution(sudoku);
        return;
    }

    for (int y = 0; y < 9; y++)
    {
        for (int x = 0; x < 9; x++)
        {
            if (sudoku[y][x] == 0)
            {
                for (int i = 1; i <= 9; i++)
                {
                    sudoku[y][x] = i;
                    if (is_valid_column(sudoku, y, x) == 1 &&
                        is_valid_row(sudoku, y, x) == 1 &&
                        is_valid_sub_box(sudoku, y, x) == 1)
                    {
                        solve_sudoku(sudoku);
                    }
                    
                }

                // restore empty cell
                sudoku[y][x] = 0;
            }
        }
    }
}

我沒試過。 所以它可能不是一個完整的解決方案。

暫無
暫無

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

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