3D屏保:N皇后


      前幾天園子里有人發表關於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"


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM