八皇后
29 Oct 2012八皇后问题:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。
<html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Eight Queens Puzzle(Recursive algorithm) - 八皇后问题(递归算法)</title> <style type="text/css"> body { background-color: #c1c1c1; } p { text-align: center; } table { border-width: 5px; border-color: #bb3355; border-style: solid; background-color: #ffffff; } td { text-align: center; vertical-align: middle; width: 70px; height: 70px; } td.b { background-color: #000000; } </style> <script type="text/javascript"> var Q = new Array(8); //八皇后所在的列位置 // 判断第n个皇后与前面的n-1个皇后是否冲突 function Clash(n) { var flag = false; //冲突标志 var i = 0; //从第0行逐行判断 while ((i < n) && !flag) { flag = (Q[n] == Q[i]) || (Math.abs(Q[n] - Q[i]) == (n - i)); //在同一列或相同的对角线即为冲突 i++; } return flag; } //搜索第n个皇后的位置 function QSeek(n) { //判断是否已经回溯到了第一个皇后之前,即已经找到了所有解 if (n >= 0) { Q[n]++; //将该位置的皇后右移一个位置 if (Q[n] < 8) //当前行的皇后右移未超出范围 { if (Clash(n)) //冲突则继续搜索当前行的皇后位置 return QSeek(n) else //不冲突则当前行搜索完成 return true; } else //当前行无法安放,递归回溯 { Q[n] = -1; //删除当前行的皇后 if (QSeek(n - 1)) //递归回溯 return QSeek(n) //在前一行搜索成功时,再搜索当前行 else return false; //无解 } } else return false; //无解 } //刷新皇后图片 function showQueens() { //清除原有图像,即清除所有TD标记中的内容 var tds = document.getElementsByTagName("TD"); for (var i = 0; i < tds.length; i++) tds[i].innerHTML = ""; //绘制新图像 for (var i = 0; i < 8; i++) { eval("r" + i + "c" + Q[i] + ".innerHTML = \"<img src=\\\"queen.jpg\\\" />\";"); } } var count = 1; //记录解的个数 function Queens() { if (count == 1) { //求第一组解时需搜索前7个皇后的位置 for (var i = 0; i < 7; i++) QSeek(i); } if (QSeek(7)) { showQueens(); seekbtn.value = "已经搜索到第" + count + "组解,准备搜索第" + ++count + "组解..."; seekbtn.focus(); //设置焦点到按钮 } else seekbtn.value = "全部解已经搜索完成,共" + (count - 1) + "组!"; } </script> </head> <body> <p> Eight Queens Puzzle (Recursive algorithm) - 八皇后问题(递归算法)<br /> </p> <center> <table cellpadding="0" cellspacing="0"> <tr> <td id="r0c0"></td> <td class="b" id="r0c1"></td> <td id="r0c2"></td> <td class="b" id="r0c3"></td> <td id="r0c4"></td> <td class="b" id="r0c5"></td> <td id="r0c6"></td> <td class="b" id="r0c7"></td> </tr> <tr> <td class="b" id="r1c0"></td> <td id="r1c1"></td> <td class="b" id="r1c2"></td> <td id="r1c3"></td> <td class="b" id="r1c4"></td> <td id="r1c5"></td> <td class="b" id="r1c6"></td> <td id="r1c7"></td> </tr> <tr> <td id="r2c0"></td> <td class="b" id="r2c1"></td> <td id="r2c2"></td> <td class="b" id="r2c3"></td> <td id="r2c4"></td> <td class="b" id="r2c5"></td> <td id="r2c6"></td> <td class="b" id="r2c7"></td> </tr> <tr> <td class="b" id="r3c0"></td> <td id="r3c1"></td> <td class="b" id="r3c2"></td> <td id="r3c3"></td> <td class="b" id="r3c4"></td> <td id="r3c5"></td> <td class="b" id="r3c6"></td> <td id="r3c7"></td> </tr> <tr> <td id="r4c0"></td> <td class="b" id="r4c1"></td> <td id="r4c2"></td> <td class="b" id="r4c3"></td> <td id="r4c4"></td> <td class="b" id="r4c5"></td> <td id="r4c6"></td> <td class="b" id="r4c7"></td> </tr> <tr> <td class="b" id="r5c0"></td> <td id="r5c1"></td> <td class="b" id="r5c2"></td> <td id="r5c3"></td> <td class="b" id="r5c4"></td> <td id="r5c5"></td> <td class="b" id="r5c6"></td> <td id="r5c7"></td> </tr> <tr> <td id="r6c0"></td> <td class="b" id="r6c1"></td> <td id="r6c2"></td> <td class="b" id="r6c3"></td> <td id="r6c4"></td> <td class="b" id="r6c5"></td> <td id="r6c6"></td> <td class="b" id="r6c7"></td> </tr> <tr> <td class="b" id="r7c0"></td> <td id="r7c1"></td> <td class="b" id="r7c2"></td> <td id="r7c3"></td> <td class="b" id="r7c4"></td> <td id="r7c5"></td> <td class="b" id="r7c6"></td> <td id="r7c7"></td> </tr> </table> <br/> <input style="width: 300px; height: 25px" type="button" id="seekbtn" value="准备搜索第1组解..." onclick="Queens()" /> </center> </body> </html>