समस्या
एक बोगल बोर्ड व्यक्तिगत कैरेक्टर्स का एक 2D ऐरे है, उदा. −
const board = [ ["I","L","A","W"], ["B","N","G","E"], ["I","U","A","O"], ["A","S","R","L"] ];
हमें एक JavaScript फ़ंक्शन लिखना है जो बोगल बोर्ड और एक स्ट्रिंग लेता है और जांचता है कि वह स्ट्रिंग बोगल बोर्ड में एक वैध अनुमान है या नहीं। वैध अनुमान वे स्ट्रिंग्स हैं जिन्हें आसन्न सेल्स (क्षैतिज, लंबवत, या विकर्ण) को जोड़कर बनाया जा सकता है बिना किसी पहले उपयोग किए गए सेल का पुन: उपयोग किए।
उदाहरण के लिए, उपरोक्त बोर्ड में "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));कोड व्याख्या
हमने जो कदम उठाए हैं −
- हम पहले अक्षर की घटना खोजने के लिए 2d ऐरे को स्कैन करते हैं
- फिर हम { स्थिति, इंडेक्स } को कतार में डालते हैं, जब तक कतार खाली नहीं है, हम पहले ऑब्जेक्ट को पॉप करते हैं
- फिर हम सभी दिशाओं में देखते हैं। यदि सेल में अक्षर शब्द में अक्षर से मेल खाता है और सेल का पुन: उपयोग नहीं किया गया है, तो हम {स्थिति, इंडेक्स} को अपडेट करते हैं और कतार में जोड़ते हैं अन्यथा, हम ऑब्जेक्ट को छोड़ देते हैं और हम तब रुकते हैं जब एक मिलान मिल जाता है या कोई मिलान नहीं होता।
आउटपुट
true