回溯法解數獨

2021-06-08 15:53:59 字數 2385 閱讀 4931

前天在我的小pad上裝了個數獨遊戲,完了幾把後興趣索然了。不過突然想起來一直想寫個解數獨的程式,不過因為懶和拖拉,就一直沒寫。今天花了30分鐘寫了個解數獨的程式,貼**:

#include #include #include //某個數字填入後,需要檢查的index

void get_affected_index(const int has_filled_index, int * affected_index)

for(int i = 0; i < 9; ++i)

int vertical_index = row_number % 3;

int horizonal_index = column_number % 3;

int first_row =0, second_row = 0;

int first_column=0, second_column =0;

if (vertical_index == 0) else if (vertical_index == 1) else if (vertical_index == 2)

if(horizonal_index == 0) else if (horizonal_index == 1) else if (horizonal_index == 2)

affected_index[affect_index_idx++] = first_row * 9 + first_column;

affected_index[affect_index_idx++] = first_row * 9 + second_column;

affected_index[affect_index_idx++] = second_row * 9 + first_column;

affected_index[affect_index_idx++] = second_row * 9 + second_column;

}//填入乙個數字後檢查是否能夠滿足數獨需求

bool check_status(char * shudu, const int has_filled_index) ;

get_affected_index(has_filled_index, affected_index);

for (int i=0; i<20; i++)

return true;

}//回溯法求解數獨

bool solve(char * shudu, const int * blank_index, const int blank_num)

int current_blank_index = blank_index[current_blank_num];

shudu[current_blank_index]++;

if (shudu[current_blank_index] == '9'+1)

if (check_status(shudu, current_blank_index)) else

}return true;

}//數獨輸出

void print_shudu(const char * shudu)

}//初始化數獨:讀取輸入並計算多少個空位,紀錄空位的index

void init_blank_index(const char * shudu, int * blank_index, int * blank_num)

}*blank_num = index;

return;

}int main(int argc, char ** argv) ;

int blank_index[81] = ;

int blank_num = 0;

printf("please input the shudu sequence, no blank character needed:\n");

scanf("%s",shudu); //不做任何合法性檢測

init_blank_index(shudu, blank_index, &blank_num);

if(solve(shudu, blank_index, blank_num))

return 0;

}

**居然寫了116行,比較扯。大部分**是輸入輸出,檢查填入數字合法性的部分寫的太拖沓了。

往深了想一下,這個演算法可以在哪兒進行優化呢?乙個啟發式的想法是:在初始化的時候就檢查每個位置可能出現的數字,把可能出現的數字較少的位置放在前面先填。這也是我們玩數獨的時候經常使用的策略——如果乙個位置只可能有乙個數字出現,那麼就先把他填上,作為乙個已知的條件,然後再繼續尋找下乙個……直到找不到這樣的位置了,再進行試探。這樣的話,外層迴圈的次數就大量減少,省去了很多無用的試探。

儘管這個想法或許真的能降低時間複雜度的,但缺少數學證明。不知道哪位大牛能夠給出這個時間複雜度的證明?

leetcode 解數獨 回溯法

如 方法 回溯法 回溯法的思想就是 對於乙個問題有多個選擇方式,先選擇乙個方式執行下去,若在執行過程中,發現不符合規則,則回退,回到選擇方式的步驟,進而選擇其他方式,繼續試。重要 對於回溯法,一定會有個 規則 這個 規則 將會決定是否回退,所以當我們在使用回溯法時,一定要留意能否構建 規則 如這一題...

回溯法 N皇后與解數獨

但中間也在用零碎的時間學學別的,今天寫總結一下回溯法。在最壞的情況下,回溯法會導致一次複雜度為指數時間的計算。回溯法實際上是一種 dfs 深度優先搜尋演算法 的一種,不同的是,回溯法具備剪枝的能力,下面通過兩個例子來具體分析回溯演算法。n 皇后問題是基於八皇后問題的進一步發展,如何能夠在 n n 大...

回溯演算法 解數獨

假設 判斷 假設 class solution def solve self,arr self.helper arr,0 defhelper self,arr,index if index 81 print arr return else if arr index 0 0代表需要填充資料 for i...