前幾天園子里有人發表關於8皇后的算法.只有代碼,沒有能運行的DEMO多枯燥.於是我這兩天抽時間寫了個N皇后的屏保程序.程序啟動后會從4皇后到14皇后顯示其所有排列,每隔0.5秒自動切換一次.按下空格鍵會停止自動切換,按-=鍵可以手動切換排列.算法是對網上找的程序做了點修改,先申請一塊8M的內存區域,將N皇后中所有合適的位置保存到該內存中,代碼如下:
1 static Ybyte g_listQueen[YD_MAX_STACKS_NUM] = {0}; 2 3 bool check_pos_valid(Ybyte loop, Ybyte value) 4 { 5 Ybyte index; 6 Ybyte data; 7 8 for(index = 0; index < loop; index ++) 9 { 10 data = g_listQueen[index]; 11 12 if(value == data) 13 return false; 14 15 if((index + data) == (loop + value)) 16 return false; 17 18 if((index - data) == (loop - value)) 19 return false; 20 } 21 22 return true; 23 } 24 25 void CNQueenEntitySP::CalculateQueen(Yuint index) 26 { 27 Ybyte loop; 28 29 for(loop = 0; loop < m_stacks; loop++) 30 { 31 if(check_pos_valid(index, loop)) 32 { 33 g_listQueen[index] = loop; 34 35 if(m_stacks - 1 == index) 36 { 37 //assert((m_resultsCount + 1)*m_stacks < YD_BUFFER_SIZE); 38 memcpy(m_resultBuffer + m_resultsCount*m_stacks, g_listQueen, m_stacks); 39 m_resultsCount++; 40 g_listQueen[index] = 0; 41 return; 42 } 43 44 CalculateQueen(index + 1); 45 g_listQueen[index] = 0; 46 } 47 } 48 }
算法使用的是遞歸,讓人感覺有些費解,我也是看好好久才搞明白.其實N皇后問題可以寫成一個N重循環,而為了解決N的不確定性,所以采用了遞歸算法.因此使用遞歸和使用N重循環其算法的復雜度是一樣的.其算法運算量隨着N數目的增加會爆增.生成14皇后的數據非常耗時,請耐心等待.再說遞歸,這樣的代碼多少都讓人頭疼,而實際應用中,我很少使用遞歸.印象中只有遍歷文件夾時才用過,很早之前還寫過一個無限遞歸的BUG導致堆棧爆掉,忘了是做什么應用了.再有就是上學時學算法,老師教的是所有的遞歸算法都可以改成循環,而考試的一個題目就是將某個遞歸算法改循環.其實反過來說,所有的循環也可以改成遞歸,我學過一個神一樣的語言prolog,它里面貌似沒有循環,所有的循環邏輯都是用遞歸實現的.寫它的代碼有種要瘋的感覺.
對於8皇后算法,最早接觸是上大學時開過一門課叫面向對象的程序設計,教材中有個DEMO是8皇后.后來這課的課程設計,大部分同學交的就是這個8皇后算法.我的也是,而且還是拷貝別人的.對這門課我目前也只有這點印象,因為當時我這課基本沒怎么上,也根本不懂什么是面向對象.誰讓這課的學分不高,考研不考呢.畢業后這本書也不見了,我現在很疑惑的是:8皇后問題和面向對象有什么關系呢?希望哪天能找到這書教材,看看這書寫過什么.
"NQueenSP.scr"全屏可執行程序
"NQueen.exe"窗口可執行程序
鼠標左鍵右鍵拖動,調節視角.
鼠標滾輪,調節攝像機的遠近.
X,恢復為默認視角並停止視角旋轉.
空格,P,暫停與恢復.
ESC,退出.
R N皇后重新開始.
[ 減少皇后數.最小為4
] 增加皇后數.最多為14
- 上一個排列
= 下一個排列
下載地址:
http://files.cnblogs.com/WhyEngine/NQueenSP.zip
屏保設置方式
XP:
將目錄下的所有文件拷貝到WINDOWS系統目錄下如"C:\WINDOWS\system32"
WIN7,WIN8:
將目錄下的所有文件拷貝到"C:\WINDOWS\SysWOW64"或"C:\WINDOWS\SysWOW32"目錄下
在設置屏保的對話框中,選擇"NQueenSP"