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