前天在我的小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...