演算法雜談 構造數獨

2021-06-19 10:06:20 字數 993 閱讀 9498

數獨描述:在9*9的格仔內,填入1~9,要求每一行每一列不能有重複數,並且,每個格仔所處的3*3格仔內不得有重複數。

分析:這是乙個典型的遞迴回溯演算法,本例中用乙個except[9][9][9]的陣列來構造每個格仔的禁忌表(就是該格仔中不能填入的數)。用變數hs來表示此次填數是向前遞迴運算還是回溯運算。如果是向前遞迴,則計算該格仔的禁忌表,如果是回溯,則將當前格仔中的數加入禁忌表。

#include #include #include #include #include //用於標記是否回溯

int hs=0;

//記錄每乙個格仔的禁忌數字,即當前格仔不能填入的數字

int except[9][9][9];

//儲存結果

int res[9][9];

//隨機獲取乙個值

int getran()

//判斷隨機的值是否在禁忌表

int inforb(int jg,int *fibd)

//判斷禁忌表是否已滿,如果滿則需要回溯

int is_full(int *fbid)

return 1;

}//構造數獨

void gouzao(int i,int j)

//當到第10行的時候遞迴結束

if(i==9)return;

//如果是回溯到當前位置的,則把該值填入禁忌表

if(hs)

else

{ int k,m;

//獲取禁忌表

bzero(except[i][j],sizeof(except[i][j]));

for(k=0;k

結果:

構造數獨和解數獨

數獨,俗稱九宮格,由乙個9 9的網格組成,整個網格又分成9個3 3的小正方形網格,每個格仔有乙個數字 1 9 數獨滿足如下要求 1 每個數字在每一行只出現一次 2 每個數字在每一列只出現一次 3 每個數字在每個3 3的小區域中也只出現一次 如下圖所示,為我們比較常見的數獨形式,為乙個缺了數字的數獨,...

1 15 構造數獨

一 用回溯法構造數獨 include include include include include using namespace std int sudu 9 9 void sudu print int sudu 9 cout endl bool is digital sudu int sudu...

1 15 構造數獨

一 用回溯法構造數獨 include include include include include using namespace std int sudu 9 9 void sudu print int sudu 9 cout endl bool is digital sudu int sudu...