八皇后問題網頁圖形版本

這學期給學生講《Web程序設計》,用JavaScript寫了一個八皇后問題網頁圖形版本,採用了遞歸回溯算法,下面是網頁截圖: javascript

算法並不複雜,經過DOM控制HTML標籤來顯示圖形,棋盤背景採用了表格,固然也能夠採用JavaScript來生成,但並不會使網頁代碼精簡不少。css

之因此沒有采用動態演示求解過程,是由於JavaScript沒法實現相似線程的Sleep休眠功能來延時,更沒法實現信號量、旗標等複雜的多線程功能,而JavaScript提供的setTimeout()和setInterval()方法實際上都是在瀏覽器中新開一個線程,並不會使腳本執行暫停,惟一的方法是爲每一步驟單獨編寫函數,但那樣作會使得程序異常晦澀難懂。固然,可能有人試圖經過死循環來定時,但會致使程序無響應,並且也沒法更新頁面內容,顯然這樣作是一個很是糟糕的辦法。html

這是全部代碼,能夠直接保存成網頁文件本地運行: java

  
  
  
  
  1. <html xmlns="http://www.w3.org/1999/xhtml"> 
  2. <head> 
  3.     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
  4.     <title>Eight Queens Puzzle(Recursive algorithm) - 八皇后問題(遞歸算法)</title> 
  5.     <style type="text/css"> 
  6.         body {  
  7.             background-color: #ffffc0;  
  8.         }  
  9.         p {  
  10.             text-align: center;  
  11.         }  
  12.         table {  
  13.             border-width: 8px;  
  14.             border-color: #604040;  
  15.             border-style: solid;  
  16.             background-color: #ffffff;  
  17.         }  
  18.         td {  
  19.             text-align: center;  
  20.             vertical-align: middle;  
  21.             width: 70px;  
  22.             height: 70px;  
  23.         }  
  24.         td.b {  
  25.             background-color: #000000;  
  26.         }  
  27.     </style> 
  28.     <script type="text/javascript"> 
  29.         var Q = new Array(8); //八皇后所在的列位置  
  30.  
  31.         // 判斷第n個皇后與前面的n-1個皇后是否衝突  
  32.         function Clash(n) {  
  33.             var flag = false; //衝突標誌  
  34.             var i = 0; //從第0行逐行判斷  
  35.             while ((i < n) && !flag) {  
  36.                 flag = (Q[n] == Q[i]) || (Math.abs(Q[n] - Q[i]) == (n - i)); //在同一列或相同的對角線即爲衝突  
  37.                 i++;  
  38.             }  
  39.             return flag;  
  40.         }  
  41.  
  42.         //搜索第n個皇后的位置  
  43.         function QSeek(n) {  
  44.             //判斷是否已經回溯到了第一個皇后以前,即已經找到了全部解  
  45.             if (n >= 0) {  
  46.                 Q[n]++; //將該位置的皇后右移一個位置  
  47.                 if (Q[n] < 8) //當前行的皇后右移未超出範圍  
  48.                 {  
  49.                     if (Clash(n)) //衝突則繼續搜索當前行的皇后位置  
  50.                         return QSeek(n)  
  51.                     else //不衝突則當前行搜索完成  
  52.                         return true;  
  53.                 }  
  54.                 else //當前行沒法安放,遞歸回溯  
  55.                 {  
  56.                     Q[n] = -1; //刪除當前行的皇后  
  57.                     if (QSeek(n - 1)) //遞歸回溯  
  58.                         return QSeek(n) //在前一行搜索成功時,再搜索當前行  
  59.                     else  
  60.                         return false; //無解  
  61.                 }  
  62.             }  
  63.             else  
  64.                 return false; //無解  
  65.         }  
  66.  
  67.         var pic = "f0"; //默認的皇后圖片字符串  
  68.  
  69.         //刷新皇后圖片  
  70.         function showQueens() {  
  71.             //清除原有圖像,即清除全部TD標記中的內容  
  72.             var tds = document.getElementsByTagName("TD");  
  73.             for (var i = 0; i < tds.length; i++)  
  74.                 tds[i].innerHTML = "";  
  75.             //繪製新圖像  
  76.             for (var i = 0; i < 8; i++) {  
  77.                 eval("r" + i + "c" + Q[i] + ".innerHTML = \"<img src=\\\"" + pic + ".png\\\" />\";");  
  78.             }  
  79.         }  
  80.  
  81.         var count = 1; //記錄解的個數  
  82.  
  83.         function Queens() {  
  84.             seekbtn.disabled = true; //禁用按鈕  
  85.             seekpic.disabled = true; //禁用下拉列表  
  86.             if (count == 1) { //求第一組解時需搜索前7個皇后的位置  
  87.                 for (var i = 0; i < 7; i++)  
  88.                     QSeek(i);  
  89.             }  
  90.             if (QSeek(7)) {  
  91.                 showQueens();  
  92.                 seekbtn.value = "已經搜索到第" + count + "組解,準備搜索第" + ++count + "組解...";  
  93.                 seekpic.disabled = false; //恢復下拉列表  
  94.                 seekbtn.disabled = false; //恢復按鈕  
  95.                 seekbtn.focus(); //設置焦點到按鈕  
  96.             }  
  97.             else  
  98.                 seekbtn.value = "所有解已經搜索完成,共" + (count - 1) + "組!";  
  99.         }  
  100.     </script> 
  101. </head> 
  102. <body> 
  103.     <p> 
  104.         Eight Queens Puzzle (Recursive algorithm) - 八皇后問題(遞歸算法)<br /> 
  105.         Mengliao Software Studio(Baiyu) - 夢遼軟件工做室(白宇)<br /> 
  106.         Copyright 2011, All right reserved. - 版權全部(C) 2011<br /> 
  107.         2011.04.04</p> 
  108.     <center> 
  109.         <table cellpadding="0" cellspacing="0"> 
  110.             <tr> 
  111.                 <td id="r0c0"></td> 
  112.                 <td class="b" id="r0c1"></td> 
  113.                 <td id="r0c2"></td> 
  114.                 <td class="b" id="r0c3"></td> 
  115.                 <td id="r0c4"></td> 
  116.                 <td class="b" id="r0c5"></td> 
  117.                 <td id="r0c6"></td> 
  118.                 <td class="b" id="r0c7"></td> 
  119.             </tr> 
  120.             <tr> 
  121.                 <td class="b" id="r1c0"></td> 
  122.                 <td id="r1c1"></td> 
  123.                 <td class="b" id="r1c2"></td> 
  124.                 <td id="r1c3"></td> 
  125.                 <td class="b" id="r1c4"></td> 
  126.                 <td id="r1c5"></td> 
  127.                 <td class="b" id="r1c6"></td> 
  128.                 <td id="r1c7"></td> 
  129.             </tr> 
  130.             <tr> 
  131.                 <td id="r2c0"></td> 
  132.                 <td class="b" id="r2c1"></td> 
  133.                 <td id="r2c2"></td> 
  134.                 <td class="b" id="r2c3"></td> 
  135.                 <td id="r2c4"></td> 
  136.                 <td class="b" id="r2c5"></td> 
  137.                 <td id="r2c6"></td> 
  138.                 <td class="b" id="r2c7"></td> 
  139.             </tr> 
  140.             <tr> 
  141.                 <td class="b" id="r3c0"></td> 
  142.                 <td id="r3c1"></td> 
  143.                 <td class="b" id="r3c2"></td> 
  144.                 <td id="r3c3"></td> 
  145.                 <td class="b" id="r3c4"></td> 
  146.                 <td id="r3c5"></td> 
  147.                 <td class="b" id="r3c6"></td> 
  148.                 <td id="r3c7"></td> 
  149.             </tr> 
  150.             <tr> 
  151.                 <td id="r4c0"></td> 
  152.                 <td class="b" id="r4c1"></td> 
  153.                 <td id="r4c2"></td> 
  154.                 <td class="b" id="r4c3"></td> 
  155.                 <td id="r4c4"></td> 
  156.                 <td class="b" id="r4c5"></td> 
  157.                 <td id="r4c6"></td> 
  158.                 <td class="b" id="r4c7"></td> 
  159.             </tr> 
  160.             <tr> 
  161.                 <td class="b" id="r5c0"></td> 
  162.                 <td id="r5c1"></td> 
  163.                 <td class="b" id="r5c2"></td> 
  164.                 <td id="r5c3"></td> 
  165.                 <td class="b" id="r5c4"></td> 
  166.                 <td id="r5c5"></td> 
  167.                 <td class="b" id="r5c6"></td> 
  168.                 <td id="r5c7"></td> 
  169.             </tr> 
  170.             <tr> 
  171.                 <td id="r6c0"></td> 
  172.                 <td class="b" id="r6c1"></td> 
  173.                 <td id="r6c2"></td> 
  174.                 <td class="b" id="r6c3"></td> 
  175.                 <td id="r6c4"></td> 
  176.                 <td class="b" id="r6c5"></td> 
  177.                 <td id="r6c6"></td> 
  178.                 <td class="b" id="r6c7"></td> 
  179.             </tr> 
  180.             <tr> 
  181.                 <td class="b" id="r7c0"></td> 
  182.                 <td id="r7c1"></td> 
  183.                 <td class="b" id="r7c2"></td> 
  184.                 <td id="r7c3"></td> 
  185.                 <td class="b" id="r7c4"></td> 
  186.                 <td id="r7c5"></td> 
  187.                 <td class="b" id="r7c6"></td> 
  188.                 <td id="r7c7"></td> 
  189.             </tr> 
  190.         </table> 
  191.         <br />皇后圖片選擇:  
  192.         <select id="seekpic" disabled="disabled" onchange="JavaScript: pic=this.value; showQueens();"> 
  193.             <option value="f0" selected="selected">圖片一</option> 
  194.             <option value="f1">圖片二</option> 
  195.             <option value="f2">圖片三</option> 
  196.             <option value="f3">圖片四</option> 
  197.             <option value="f4">圖片五</option> 
  198.             <option value="f5">圖片六</option> 
  199.             <option value="f6">圖片七</option> 
  200.             <option value="f7">圖片八</option> 
  201.             <option value="f8">圖片九</option> 
  202.             <option value="f9">圖片十</option> 
  203.         </select>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  
  204.         <input style="width: 300px; height: 25px" type="button" id="seekbtn" value="準備搜索第1組解..." onclick="Queens()" /> 
  205.     </center> 
  206. </body> 
  207. </html> 

標準的遞歸回溯算法,在求的每一組解後將末行的皇后向後移動一個位置繼續求解,天然就是下一組解了,當全部解(共92組)求出後,將致使主函數返回false。算法

相關文章
相關標籤/搜索