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

2021-05-25 06:38:42 字數 2083 閱讀 6645

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

今天我給大家講的回溯+剪枝法,不僅可以用於解決數獨問題,而且還可以方便用於其他難題。

先介紹回溯+剪枝法吧:回溯+剪枝

可以這樣說 回溯+剪枝 法是解決一般性難題的很好的方法,當然如果難題的規模太大的話,計算機記憶體和執行時間,可能就超出你的範圍了。

回溯法就是在問題的解空間中搜尋滿足條件的解。

要使用回溯法:需理解三個問題(我的理解)

1、怎樣構造解空間

2、在什麼條件下回,即剪枝的條件

3、回到哪個節點

在類cgrid中定義靜態函式如下

static bool issingleinrow(int num,int row,int grid[9][9]);

//判斷數num 在行row 中是否唯一

static bool issingleincolumn(int num, int colunm, int grid[9][9]);

//判斷數num 在列column 中是否唯一

static bool issinglegongge(int num,int row,int column,int grid[9][9]);

//判斷數num 在行row ,列column所在的子宮格中是否唯一

上面的幾個函式,非常非常的簡單,即不寫了,但在函式getallresult中 會被用到

下面主要看getallresult是怎麼寫的哦,這個函式是要求出所有的解哦,並存在filename指定的檔案中

static bool getallresult(int grid[9], cstring filename);//filename 用於儲存所有的結果

對了,還有個結構體,非常的重要,用於儲存空格的相關資訊

struct blank;

bool cgrid::getallresult(int grid[9], cstring filename) }

blank[blank_num].candidate_num = candidate_num; //候選數個數

blank_num++; //空格數加1 }

} }

int tempnum;

int succeed=0; //標示這次選擇是否選出了合法的候選數

int node_index=0; //表示節點

int new_node_index=-1;

while (true)

else }

//succeed==0 標示這次沒選成功,乙個都不合法,就回啊

//如果我們發現方格i中的所有候選數均不能滿足條件,說明以前的選擇有誤,

//應重新選擇以前空格中的候選數,

//空格下面的p滿足condition_12:1、空格還有候選數可選;2、該空格距離當前的空格最近

// cout<

if (succeed==0) //succeed==0 標示這次沒選成功,乙個候選數都不合法

}if (new_node_index==-1) //p==-1表明所有空格均不滿足condition_12

//撤銷操作

for (int q=new_node_index+1;q <=node_index;q++)

node_index=new_node_index; //回到p處 重新選擇下乙個候選數}

//succeed==1,表示再根節點處找到了合法的候選數

//node_index==blank_num-1 表示已經搜尋跟節點,

if (succeed==1 && node_index==blank_num)}

if (new_node_index==-1) //p==-1表明所有空格均不滿足condition_12

//撤銷操作

for (int q=new_node_index+1;q }

node_index = new_node_index; //回到p處 重新選擇下乙個候選數 }

}return true; }

第一次在csdn寫文章,寫的不好!

華為OJ(數獨遊戲 Sudoku)

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

數獨 sudoku 遊戲的程式求解

9x9的正方形方格可以分成9個3 3的九宮格。數獨遊戲是在這樣的正方形中,首先事先給某些方格填入1 9的數字,然後要求在餘下的方格中也填入1 9的數字,要求每一行,每一列,以及每個九宮格中,都正好包含1 9這九個數字。解算 sudoku 的方法很多,前段時間閒的無聊我也寫了乙個。演算法很簡單,就是試...

數獨(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...