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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 前端技术 > javascript >内容正文

javascript

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

發(fā)布時(shí)間:2023/12/2 javascript 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 a算法解决八数码问题_javascript,八皇后问题解决 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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

方法check和方法check2的原理其實(shí)是一樣的,check方法用的是遞歸實(shí)現(xiàn),check2方法用的是普通for循環(huán)實(shí)現(xiàn),

根據(jù)排隊(duì)組合理論

八皇后的放置位置一共有8的8次方個(gè),

每個(gè)皇后都有八種放置位置,所以乘起來(lái)就是8的8次方個(gè),

check2方法的8個(gè)for循環(huán)就是這個(gè)道理

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

測(cè)試:

總結(jié)

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

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。