數獨 sudoku 遊戲的程式求解

2021-06-06 10:00:11 字數 2254 閱讀 6996

9x9的正方形方格可以分成9個3×3的九宮格。

數獨遊戲是在這樣的正方形中,首先事先給某些方格填入1-9的數字,然後要求在餘下的方格中也填入1-9的數字,要求每一行,每一列,以及每個九宮格中,都正好包含1-9這九個數字。

解算 sudoku 的方法很多,前段時間閒的無聊我也寫了乙個。演算法很簡單,就是試填+遞迴窮舉。方法有些暴力,不過很有效,程式也非常的簡潔。

實際上,寫完程式後我才發現,sudoku 的難點其實不在解算,而是如何生成

數獨題目,並且保證生成的題目解是唯一的。這個問題還要再思考思考,現在還沒有什麼思路。

下面是源程式,c語言寫的,盡可能的使其保持 kiss (keep it ****** and stupid)

sudoku 函式求出乙個解。

sudoku_all 函式則試圖窮舉所有可行解。

#include #include #include #define size 9

void display(char mat[size][size], char mes);

void copy(char src[size][size], char des[size][size]);

bool containinrow(char mat[size][size], int element, int row);

bool containincol(char mat[size][size], int element, int col);

bool containinblock(char mat[size][size], int element, int row, int col);

bool findfirstemptypos(char mat[size][size], int pos[2]);

void load(char mat[size][size]);

bool sudoku(char mat[size][size]);

bool sudoku_all(char mat[size][size]);

static int solution_count = 0;

static char message = "the number of possible solution is 9999999:";

int main(void)

bool sudoku(char mat[size][size])

copy(mat, b); // 到這裡說明 j 填的不對,恢復 b ,重新填

} return false; // 到這裡了說明 1-9都試了全都不對,表明當前狀態無解

}bool sudoku_all(char mat[size][size]) //解出所有的可行解

for(int j = 1; j <= size; j ++)

// 如果沒找到解,同樣也要恢復原始狀態,試下乙個可能的數

}void load(char mat[size][size])

}}void display(char mat[size][size], char mes)

puts("");

}}/**

* @brief 判斷乙個數是否已經在這一行出現過了

*/bool containinrow(char mat[size][size], int element, int row)

return false;

}/**

* @brief 判斷乙個數是否已經在這一列出現過了

*/bool containincol(char mat[size][size], int element, int col)

return false;

}/**

* @brief 判斷乙個數是否已經在這一3*3的小方塊中出現過了

*/bool containinblock(char mat[size][size], int element, int row, int col)

}return false;

}void copy(char src[size][size], char des[size][size])

}}/**

* @brief 找到第乙個需要填數字的位置

* @para pos 通過 pos 返回位置座標, pos[0] 為行號, pos[1] 為列號

*/bool findfirstemptypos(char mat[size][size], int pos[2])

; }

}return false;

}

數獨(Sudoku)求解程式

數獨完全求解程式 ver 3.0 coolypf 2008 11 24 22 11 include using namespace std int matrix 9 9 數獨矩陣 int count 0 解的個數 int check int x,int y,bool mark 10 檢測matrix...

華為OJ(數獨遊戲 Sudoku)

描述 問題描述 數獨 sudoku 是一款大眾喜愛的數字邏輯遊戲。玩家需要根據9x9盤面上的已知數字,推算出所有剩餘空格的數字,並且滿足每一行 每一列 每乙個粗線宮內的數字均含1 9,並且不重複。輸入 包含已知數字的9x9盤面陣列 空缺位以數字0表示 輸出 完整的9x9盤面陣列 知識點查詢,搜尋,排...

數獨遊戲(sudoku)演算法 回溯 剪枝

具體數獨遊戲是什麼,我就不介紹了,好像多餘了,你能來看這篇文章,說明你對數獨遊戲已經有了相當的了解了!還是入正題吧,今天先講解和發下用回溯 剪枝 求數獨遊戲,我也看了些回溯 剪枝求數獨的演算法,很惱火,既沒注釋,而且演算法沒有通用性。今天我給大家講的回溯 剪枝法,不僅可以用於解決數獨問題,而且還可以...