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

歡迎訪問 生活随笔!

生活随笔

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

javascript

残缺棋盘问题算法分析_javascript使用递归回溯算法和贪心算法解决马踏棋盘问题...

發(fā)布時間:2025/4/16 javascript 51 豆豆
生活随笔 收集整理的這篇文章主要介紹了 残缺棋盘问题算法分析_javascript使用递归回溯算法和贪心算法解决马踏棋盘问题... 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

馬踏棋盤算法介紹和游戲演示

1.馬踏棋盤算法也被稱為騎士周游問題

2.將馬隨機(jī)放在國際象棋的8×8棋盤Board[0~7][0~7]的某個方格中,馬按走棋規(guī)則(馬走日字)進(jìn)行移動。要求每個方格只進(jìn)入一次,走遍棋盤上全部64個方格

3.游戲演示: 馬踏棋盤_馬踏棋盤html5游戲在線玩_4399h5游戲-4399在線玩

馬踏棋盤游戲代碼實(shí)現(xiàn)

1.馬踏棋盤問題(騎士周游問題)實(shí)際上是圖的深度優(yōu)先搜索(DFS)的應(yīng)用。

2.如果使用回溯(就是深度優(yōu)先搜索)來解決,假如馬兒踏了53個點(diǎn),如圖:走到了第53個,坐標(biāo)(1,0),發(fā)現(xiàn)已經(jīng)走到盡頭,沒辦法,那就只能回退了,查看其他的路徑,就在棋盤上不停的回溯…… ,思路分析+代碼實(shí)現(xiàn)

3.分析第一種方式的問題,并使用貪心算法(greedyalgorithm)進(jìn)行優(yōu)化。解決馬踏棋盤問題.

4.使用前面的游戲來驗(yàn)證算法是否正確。

/****騎士周游問題1.創(chuàng)建周游問題的解決步驟和思路2.將當(dāng)前位置設(shè)置為已經(jīng)訪問,然后根據(jù)當(dāng)前位置,計算馬兒還能走哪些位置,并放入到一個集合中,最后有8個位置,每走一步,就使用step+13.遍歷list中存放的所有位置,看看哪個位置可以走通,如果走通,就回溯4.判斷馬兒是否完成了任務(wù),使用step和應(yīng)該走的步數(shù)比較,如果沒有達(dá)到數(shù)量,則表示沒有完成任務(wù),將整個棋盤置0注意:馬兒不同的走法(策略),會得到不同的結(jié)果,效率也有影響(優(yōu)化),注意:如果不用貪心算法進(jìn)行優(yōu)化,計算步驟會十分龐大導(dǎo)致js線程卡死,馬踏棋盤問題和迷宮問題不一樣,馬踏棋盤算法中一個點(diǎn)可能會走很多次,而迷宮問題中一個點(diǎn)只會走一次所以馬踏棋盤算法的計算量要大的多使用貪心算法進(jìn)行優(yōu)化1.我們獲取當(dāng)前位置,可以走的下一個位置的集合ps2.我們需要對ps中所有的point下一步的所有集合的數(shù)目,進(jìn)行非遞減排序,其實(shí)就是遞增 優(yōu)化的原因,我們優(yōu)先選擇所有的下一個位置的選擇的位置最小的那個, 可以減少回溯假設(shè)我們每一個馬兒位置,有n個位置可以繼續(xù)走,我們此時不知道這n個位置能否成功走完棋盤,那么 設(shè)每個位置的完成概率是相等的p(n*p=1),但是我們可以確定每個位置的完成時間 (完成時間=成功時間*成功概率+失敗時間*失敗概率,成功時間,成功概率和失敗概率是相等的,但是失敗時間不等) 大小,n個位置的完成時間,依次為t1,t2,...tn,....., 此時我們可以看到走n1和n2位置成功與走n3和n4的總成功率是相等的,但是總完成時間是不等, 我們?yōu)榱诵?#xff0c;在獲取相同成功率的情況下,總完成時間越短則效率越高***/class HorseChessboard {x;//棋盤的列數(shù)y;//棋盤的行數(shù)visited = [];//創(chuàng)建一個數(shù)組,標(biāo)記棋盤的各個位置是否被訪問過//使用一個屬性,標(biāo)記是否棋盤的所有位置都被訪問過finished;constructor() {}//我們需要對ps中所有的point下一步的所有集合的數(shù)目,進(jìn)行非遞減排序,其實(shí)就是遞增sort = (o1, o2) => {//獲取到o1的下一步的所有位置個數(shù)let count1 = this.next(o1).length;//獲取到o2的下一步的所有位置個數(shù)let count2 = this.next(o2).length;if (count1 < count2) {return -1;} else if (count1 == count2) {return 0;} else {return 1;}}/*** 完成騎士周游問題的算法* @param {棋盤} chessboard * @param {馬兒當(dāng)前位置的行,初始為0} row * @param {馬兒當(dāng)前位置的列,初始為0} col * @param {第第幾步,初始位置為1} step */traversalChessboard(chessboard, row, col, step) {chessboard[row][col] = step;this.visited[row * this.x + col] = true;//標(biāo)記為已訪問//獲取當(dāng)前位置可以走的下一個位置的集合let ps = this.next(new Point(col, row));//貪心算法優(yōu)化,對ps中所有的point下一步的所有集合的數(shù)目,進(jìn)行非遞減排序,其實(shí)就是遞增ps.sort(this.sort);//遍歷pswhile (ps.length > 0) {//取出下一個可以走的位置let p = ps.shift();//判斷該點(diǎn)是否已經(jīng)訪問過if (!this.visited[p.y * this.x + p.x]) {//還沒訪問過this.traversalChessboard(chessboard, p.y, p.x, step + 1);}}//判斷馬兒是否完成了任務(wù)//如果沒有達(dá)到數(shù)量,則表示沒有完成任務(wù),將整個棋盤置0//說明:step < this.x * this.y成立的情況有兩種//1.棋盤到目前位置,棋盤沒有走完//2。棋盤處于一個回溯過程if (step < this.x * this.y && !this.finished) {chessboard[row][col] = 0;this.visited[row * this.x + col] = false;} else {this.finished = true;}}/*** 根據(jù)當(dāng)前位置,計算馬兒還能走哪些位置,最多有8個位置* @param {*} curPoint */next(curPoint) {let list = [];let p1 = new Point();//1.表示馬兒可以走左二上一這個位置if ((p1.x = curPoint.x - 2) >= 0 && (p1.y = curPoint.y - 1) >= 0) {list.push(new Point(p1.x, p1.y));}//2.判斷馬兒可以走左一上二if ((p1.x = curPoint.x - 1) >= 0 && (p1.y = curPoint.y - 2) >= 0) {list.push(new Point(p1.x, p1.y));}//3.判斷馬兒可以走右一上二if ((p1.x = curPoint.x + 1) < this.x && (p1.y = curPoint.y - 2) >= 0) {list.push(new Point(p1.x, p1.y));}//4.表示馬兒可以走右二上一if ((p1.x = curPoint.x + 2) < this.x && (p1.y = curPoint.y - 1) >= 0) {list.push(new Point(p1.x, p1.y));}//5.表示馬兒可以走右二下一if ((p1.x = curPoint.x + 2) < this.x && (p1.y = curPoint.y + 1) < this.y) {list.push(new Point(p1.x, p1.y));}//6.表示馬兒可以走右一下二if ((p1.x = curPoint.x + 1) < this.x && (p1.y = curPoint.y + 2) < this.y) {list.push(new Point(p1.x, p1.y));}//7.表示馬兒可以走左一下二if ((p1.x = curPoint.x - 1) >= 0 && (p1.y = curPoint.y + 2) < this.y) {list.push(new Point(p1.x, p1.y));}//8.表示馬兒可以走右二下一if ((p1.x = curPoint.x - 2) >= 0 && (p1.y = curPoint.y + 1) < this.y) {list.push(new Point(p1.x, p1.y));}return list;} }//點(diǎn)坐標(biāo) class Point {x;y;constructor(x, y) {this.x = x;this.y = y;} }//測試騎士周游算法 let x = 8, y = 8; let test = new HorseChessboard(); test.x = x; test.y = y;let row = 1;//馬兒初始位置的行,1 let column = 1;//馬兒初始位置的列,1 //創(chuàng)建棋盤 let chessboard = new Array(y); for (let i = 0; i < y; i++) {chessboard[i] = new Array(x).fill(0); } test.visited = new Array(x * y).fill(false); test.traversalChessboard(chessboard, row - 1, column - 1, 1); //輸出棋盤 console.log('棋盤走的步驟:', chessboard); console.log(test);

測試:

總結(jié)

以上是生活随笔為你收集整理的残缺棋盘问题算法分析_javascript使用递归回溯算法和贪心算法解决马踏棋盘问题...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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