當前位置:
首頁 >
前端技术
> javascript
>内容正文
javascript
残缺棋盘问题算法分析_javascript使用递归回溯算法和贪心算法解决马踏棋盘问题...
生活随笔
收集整理的這篇文章主要介紹了
残缺棋盘问题算法分析_javascript使用递归回溯算法和贪心算法解决马踏棋盘问题...
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
馬踏棋盤算法介紹和游戲演示
1.馬踏棋盤算法也被稱為騎士周游問題
2.將馬隨機放在國際象棋的8×8棋盤Board[0~7][0~7]的某個方格中,馬按走棋規則(馬走日字)進行移動。要求每個方格只進入一次,走遍棋盤上全部64個方格
3.游戲演示: 馬踏棋盤_馬踏棋盤html5游戲在線玩_4399h5游戲-4399在線玩
馬踏棋盤游戲代碼實現
1.馬踏棋盤問題(騎士周游問題)實際上是圖的深度優先搜索(DFS)的應用。
2.如果使用回溯(就是深度優先搜索)來解決,假如馬兒踏了53個點,如圖:走到了第53個,坐標(1,0),發現已經走到盡頭,沒辦法,那就只能回退了,查看其他的路徑,就在棋盤上不停的回溯…… ,思路分析+代碼實現
3.分析第一種方式的問題,并使用貪心算法(greedyalgorithm)進行優化。解決馬踏棋盤問題.
4.使用前面的游戲來驗證算法是否正確。
/****騎士周游問題1.創建周游問題的解決步驟和思路2.將當前位置設置為已經訪問,然后根據當前位置,計算馬兒還能走哪些位置,并放入到一個集合中,最后有8個位置,每走一步,就使用step+13.遍歷list中存放的所有位置,看看哪個位置可以走通,如果走通,就回溯4.判斷馬兒是否完成了任務,使用step和應該走的步數比較,如果沒有達到數量,則表示沒有完成任務,將整個棋盤置0注意:馬兒不同的走法(策略),會得到不同的結果,效率也有影響(優化),注意:如果不用貪心算法進行優化,計算步驟會十分龐大導致js線程卡死,馬踏棋盤問題和迷宮問題不一樣,馬踏棋盤算法中一個點可能會走很多次,而迷宮問題中一個點只會走一次所以馬踏棋盤算法的計算量要大的多使用貪心算法進行優化1.我們獲取當前位置,可以走的下一個位置的集合ps2.我們需要對ps中所有的point下一步的所有集合的數目,進行非遞減排序,其實就是遞增 優化的原因,我們優先選擇所有的下一個位置的選擇的位置最小的那個, 可以減少回溯假設我們每一個馬兒位置,有n個位置可以繼續走,我們此時不知道這n個位置能否成功走完棋盤,那么 設每個位置的完成概率是相等的p(n*p=1),但是我們可以確定每個位置的完成時間 (完成時間=成功時間*成功概率+失敗時間*失敗概率,成功時間,成功概率和失敗概率是相等的,但是失敗時間不等) 大小,n個位置的完成時間,依次為t1,t2,...tn,....., 此時我們可以看到走n1和n2位置成功與走n3和n4的總成功率是相等的,但是總完成時間是不等, 我們為了效率,在獲取相同成功率的情況下,總完成時間越短則效率越高***/class HorseChessboard {x;//棋盤的列數y;//棋盤的行數visited = [];//創建一個數組,標記棋盤的各個位置是否被訪問過//使用一個屬性,標記是否棋盤的所有位置都被訪問過finished;constructor() {}//我們需要對ps中所有的point下一步的所有集合的數目,進行非遞減排序,其實就是遞增sort = (o1, o2) => {//獲取到o1的下一步的所有位置個數let count1 = this.next(o1).length;//獲取到o2的下一步的所有位置個數let count2 = this.next(o2).length;if (count1 < count2) {return -1;} else if (count1 == count2) {return 0;} else {return 1;}}/*** 完成騎士周游問題的算法* @param {棋盤} chessboard * @param {馬兒當前位置的行,初始為0} row * @param {馬兒當前位置的列,初始為0} col * @param {第第幾步,初始位置為1} step */traversalChessboard(chessboard, row, col, step) {chessboard[row][col] = step;this.visited[row * this.x + col] = true;//標記為已訪問//獲取當前位置可以走的下一個位置的集合let ps = this.next(new Point(col, row));//貪心算法優化,對ps中所有的point下一步的所有集合的數目,進行非遞減排序,其實就是遞增ps.sort(this.sort);//遍歷pswhile (ps.length > 0) {//取出下一個可以走的位置let p = ps.shift();//判斷該點是否已經訪問過if (!this.visited[p.y * this.x + p.x]) {//還沒訪問過this.traversalChessboard(chessboard, p.y, p.x, step + 1);}}//判斷馬兒是否完成了任務//如果沒有達到數量,則表示沒有完成任務,將整個棋盤置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;}}/*** 根據當前位置,計算馬兒還能走哪些位置,最多有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;} }//點坐標 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 //創建棋盤 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);測試:
總結
以上是生活随笔為你收集整理的残缺棋盘问题算法分析_javascript使用递归回溯算法和贪心算法解决马踏棋盘问题...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: burpsuit拦截不了_burpsui
- 下一篇: MariaDB(MySQL)_Maria