軟體設計師演算法之回溯法 8皇后問題

2021-08-08 08:07:48 字數 797 閱讀 3995

8皇后問題,我想it人士應該基本都聽過了。特別是會下西洋棋的。規則很簡單,每乙個皇后會攻擊每一條線的其它皇后,因此要確保每一條線上(包括直線和對角斜線)只能存在乙個皇后。8皇后問題我一直沒有編寫過**去實現。今天正好補上。

如下是實現**:

#define max_row    8

#define max_column 8

unsigned char g_queenarray[max_row][max_column] = ;

unsigned int g_queensolvecount = 0;

void queensolve(int row);

void queentest()

bool queencheck(int row,int column)

if(g_queenarray[i][j])

i--;

j++;

} while (1);

return true;

}void printqueen()

12*12皇后問題,debug版本在我的電腦上執行時間為104秒:

可以看到,執行的時間是巨大的。如果是16*16皇后呢,32*32呢,64*64呢,搜尋空間會越來越大導致執行時間不可接受。

我們有2種辦法可以優化,一是把遞迴修改為迭代實現,二是通過枝減盡快把一些不可能解排除。具體的實現就先遺留在這裡。等有空再編寫**實現吧。

軟體設計師演算法之回溯法 全排列

全排列大家都知道。這裡是通過最普遍的全排列,來理解回溯法的乙個實現。最普通的全排列,比如a b c 三個字母,每個字母只能用一次,來進行排列,共有6種結果,比如abc,acd等。這個全排列結果和我們現實生活中n個人排隊的可能性的結果是一樣的。我這邊的思路就是按照位置來進行,比如n個元素,首先第1個位...

軟考 軟體設計師 演算法

分類 插入排序 直接插入,希爾排序 選擇排序 簡單選擇,堆排序 交換排序 氣泡排序,快速排序 歸併排序 基數排序 直接插入排序 每一步將乙個待排序列根據乙個元素值的大小插入已經排好序的那部分去。首個元素歸入已排好序列 第二個元素跟已排好序列比較,放於那位子,後續元素遞推。希爾排序 對直接插入排序的改...

軟體設計師演算法之分治法 快速排序

快速排序也是通過分治法。它的思路是先確定第乙個元素的位置,該位置之前的元素全部小於第乙個元素,該位置之後的元素全部大於該元素。確定位置後,把陣列分為了前後2部分,對這2部分執行遞迴操作,直達遞迴到陣列為1的大小,即遞迴到了最底層,即完成了排序過程。比如陣列 5,3,8,1,23,14,首先選取第乙個...