簡體   English   中英

遞歸回溯數獨求解器

[英]Recursive backtracking Sudoku solver

我目前正在學習C ,主要是來自Euler項目的示例。 (<-如果您還不知道,請檢查一下!)

根據互聯網上的一些資源和一些自行編寫的代碼,我制作了一個可以解決50個Sudokus的C程序。 我定義了一個數組,如[數獨數] [行] [列]。 以下是求解函數。

int solve(int puzzles[50][9][9], int sudokuNumber, int row, int col){
int nextNum = 1;

if (row == 8){
    return 1;
}

if (puzzles[sudokuNumber][row][col]){
    if (col == 8){
        if (solve(puzzles, sudokuNumber, row+1, 0))
            return 1;
    }
    else {
        if (solve(puzzles, sudokuNumber, row, col+1))
            return 1;
    }
    return 0;
}

for (; nextNum <= 9; nextNum++){
    if (isValid(sudokuNumber, row, col, nextNum)){
        puzzles[sudokuNumber][row][col] = nextNum;
        if (col == 8){
            if (solve(puzzles, sudokuNumber, row+1, 0))
                return 1;
        }
        else {
            if (solve(puzzles, sudokuNumber, row, col+1))
                return 1;
        }
    }
}
}

不幸的是,哪一個並沒有真正輸出任何東西,並且現在令人沮喪……我犯了一個明顯的愚蠢錯誤嗎? 如果有效,則isValid返回1,此函數正確。

如果有人來看看,將不勝感激。

首先,我認為功能簽名需要固定。 他們應該選一個董事會,而不是董事會清單。 在求解函數之外的列表上進行迭代(實際上,無需將所有電路板都加載到內存中,您只需要對由(0,0)(0,1),(0,2)位置形成的數字求和從所有董事會)
void solve(int board[][], int row, int col) ->嘗試從board [row] [col]開始求解
bool is_valid(int board[][], int row, int col, int d) ->是否可以用d填充board [row] [col]

第二,邊界條件似乎不正確。 假設row&col的取值范圍為0到8,則應為row==9col==9而不是8。

另外,我認為您必須跳過已經填充的單元格。 if(board[row][col] != 0) solve(board, row, col+1)

另外,根據is_valid的實現方式,您必須確保正確填充。 在問題中,未填充的行表示為0。 因此,在未能以1到9的所有數字填充board [row] [col]后回溯之前,請確保將board [row] [col]設置回0。

暫無
暫無

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

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