日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

a算法解决八数码问题_javascript,八皇后问题解决

發布時間:2023/12/2 javascript 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 a算法解决八数码问题_javascript,八皇后问题解决 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

八皇后問題
八皇后問題,是一個古老而著名的問題,是回溯算法的典型案例。
該問題是國際西洋棋棋手馬克斯·貝瑟爾于1848年提出:
在8×8格的國際象棋上擺放八個皇后,使其不能互相攻擊,
即:任意兩個皇后都不能處于同一行、同一列或同一斜線上,問有多少種擺法。
八皇后問題思路
1.第一個皇后先放第一行第一列
2.第二個皇后放在第二行第一列、然后判斷是否OK, 如果不OK,繼續放在第二列、第三列、依次把所有列都放完,找到一個合適
3.繼續第三個皇后,還是第一列、第二列……直到第8個皇后也能放在一個不沖突的位置,算是找到了一個正確解
4.當得到一個正確解時,在?;赝说缴弦粋€棧時,就會開始回溯,即將第一個皇后,放到第一列的所有正確解,全部得到.
5.然后回頭繼續第一個皇后放第二列,后面繼續循環執行 1,2,3,4的步驟

方法check和方法check2的原理其實是一樣的,check方法用的是遞歸實現,check2方法用的是普通for循環實現,

根據排隊組合理論

八皇后的放置位置一共有8的8次方個,

每個皇后都有八種放置位置,所以乘起來就是8的8次方個,

check2方法的8個for循環就是這個道理

/*** 八皇后問題八皇后問題,是一個古老而著名的問題,是回溯算法的典型案例。該問題是國際西洋棋棋手馬克斯·貝瑟爾于1848年提出:在8×8格的國際象棋上擺放八個皇后,使其不能互相攻擊,即:任意兩個皇后都不能處于同一行、同一列或同一斜線上,問有多少種擺法。八皇后問題思路 1.第一個皇后先放第一行第一列 2.第二個皇后放在第二行第一列、然后判斷是否OK, 如果不OK,繼續放在第二列、第三列、依次把所有列都放完,找到一個合適 3.繼續第三個皇后,還是第一列、第二列……直到第8個皇后也能放在一個不沖突的位置,算是找到了一個正確解 4.當得到一個正確解時,在?;赝说缴弦粋€棧時,就會開始回溯,即將第一個皇后,放到第一列的所有正確解,全部得到. 5.然后回頭繼續第一個皇后放第二列,后面繼續循環執行 1,2,3,4的步驟 * * *///定義一個max表示共有多少啊個皇后 const max = 8; //定義數組array,保存皇后放置位置的結果,arr的index表示行,arr[index]值表示列,比如arr = {0,4,7,5,2,6,1,3}, //比如第二個皇后的坐標為第二行第四列 let array = new Array(max), step = 0, resultArr = []; let array2 = new Array(max), step2 = 0, resultArr2 = [];//測試八皇后是否正確 check(0); console.log('步數:', step); console.log('解法數組:', resultArr); check2(); console.log('步數2:', step2); console.log(resultArr2)//編寫一個方法,放置第n個皇后 function check(n) {if (n === max) { // n=8,其實八個皇后就已經放好了resultArr.push([...array])return}//依次放入皇后,并判斷是否沖突for (let i = 0; i < max; i++) {//先把當前這個皇后n,放在該行的第1列array[n] = i;//統計步數step++;//判斷當放置第n個皇后到i列時,是否沖突if (judge(n)) {//不沖突//接著放第n+1個皇后,即開始遞歸check(n + 1)}//如果沖突,就繼續執行array[n] = i;即將第n個皇后,放置在本行的后移的一個位置} }//第二種寫法,使用for循環遍歷完成 //八層for循環 function check2() {for (let a = 0; a < 8; a++) {array2[0] = a;step2++;if (!judge2(0)) {continue}for (let b = 0; b < 8; b++) {array2[1] = b;step2++;if (!judge2(1)) {continue}for (let c = 0; c < 8; c++) {array2[2] = c;step2++;if (!judge2(2)) {continue}for (let d = 0; d < 8; d++) {array2[3] = d;step2++;if (!judge2(3)) {continue}for (let e = 0; e < 8; e++) {array2[4] = e;step2++;if (!judge2(4)) {continue}for (let f = 0; f < 8; f++) {array2[5] = f;step2++;if (!judge2(5)) {continue}for (let g = 0; g < 8; g++) {array2[6] = g;step2++;if (!judge2(6)) {continue}for (let h = 0; h < 8; h++) {array2[7] = h;step2++;if (judge2(7)) {resultArr2.push([...array2])}}}}}}}}} }//當我們放置第n個皇后,就去檢測該皇后是否和前面已經擺放的皇后沖突 /*** * @param {表示第n個皇后} n */ function judge(n) {for (let i = 0; i < n; i++) {//1.array[i] == array[n] 表示判斷第n個皇后是否和前面的n-1個皇后在同一列//2.Math.abs(n-i) === Math.abs(array[n] - array[i])表示在同一個斜線//n=1 放置第2列1 n=1 array[1] = 1// Math.abs(1-0) == 1 Math.abs(array[n] - array[i])=Math.abs(1-0) = 1//3.判斷是否在同一行,沒有必要,n每次都在遞增if (array[i] === array[n] ||Math.abs(n - i) === Math.abs(array[n] - array[i])) {return false}}return true }function judge2(n) {for (let i = 0; i < n; i++) {//1.array[i] == array[n] 表示判斷第n個皇后是否和前面的n-1個皇后在同一列//2.Math.abs(n-i) === Math.abs(array[n] - array[i])表示在同一個斜線//n=1 放置第2列1 n=1 array[1] = 1// Math.abs(1-0) == 1 Math.abs(array[n] - array[i])=Math.abs(1-0) = 1//3.判斷是否在同一行,沒有必要,n每次都在遞增if (array2[i] === array2[n] ||Math.abs(n - i) === Math.abs(array2[n] - array2[i])) {return false}}return true }

測試:

總結

以上是生活随笔為你收集整理的a算法解决八数码问题_javascript,八皇后问题解决的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。