使用JavaScript驗證Boggle單詞
問題
Boggle棋盤是一個二維字元陣列,例如:
const board = [ ["I","L","A","W"], ["B","N","G","E"], ["I","U","A","O"], ["A","S","R","L"] ];
我們需要編寫一個JavaScript函式,該函式接收Boggle棋盤和一個字串作為輸入,並檢查該字串是否為Boggle棋盤中的有效猜測。有效的猜測是可以透過連線相鄰單元格(水平、垂直或對角線)形成的字串,並且不會重複使用任何先前使用的單元格。
例如,在上圖棋盤中,“LINGO”和“ILNBIA”都是有效的猜測,而“BUNGIE”和“SINUS”則不是。
示例
以下是程式碼:
const board = [ ["I","L","A","W"], ["B","N","G","E"], ["I","U","A","O"], ["A","S","R","L"] ]; const guess = 'BINGO'; const checkWord = (board = [], guess = '') => { const numRows = board.length; const numCols = board[0].length; let queue = board.reduce((acc, row, i) => { row.forEach((x, j) => { if (x === guess[0]) { acc.push ( { pos: {r: i, c: j} , nextIndex: 1, path: [numCols*i + j ] } ); } }); return acc; }, []); let exploreWord = (obj, queue) => { let allMoves = [ {r: obj.pos.r - 1, c: obj.pos.c }, {r: obj.pos.r + 1, c: obj.pos.c }, {r: obj.pos.r, c: obj.pos.c - 1 }, {r: obj.pos.r, c: obj.pos.c + 1 }, {r: obj.pos.r - 1, c: obj.pos.c - 1 }, {r: obj.pos.r - 1, c: obj.pos.c + 1 }, {r: obj.pos.r + 1, c: obj.pos.c - 1 }, {r: obj.pos.r + 1, c: obj.pos.c + 1 }]; allMoves.forEach((o) => { let index = numCols * o.r + o.c; if (o.r >= 0 && o.r < numRows && o.c >= 0 && o.c < numCols) { if (board[o.r][o.c] === guess[obj.nextIndex] && !obj.path.includes(index)) { let cloneObj = JSON.parse(JSON.stringify(obj)); cloneObj.pos = { r: o.r, c: o.c }; cloneObj.nextIndex += 1; cloneObj.path.push(index); queue.push(cloneObj); } } }); }; while (queue.length > 0) { let obj = queue.shift(); if (obj.nextIndex === guess.length) { return true; } exploreWord(obj, queue); } return false; }; console.log(checkWord(board, guess));
程式碼解釋
我們採取的步驟如下:
我們掃描二維陣列以查詢第一個字母的出現位置。
然後我們將{位置,索引}推入佇列,當佇列非空時,我們將第一個物件彈出。
然後我們查詢所有方向。如果單元格中的字母與單詞中的字母匹配,並且單元格未被重複使用,則我們更新{位置,索引}並將其新增到佇列中;否則,我們丟棄該物件。當找到匹配項或所有方向都未找到匹配項時,我們停止。
輸出
true
廣告