Я пытаюсь создать вариант проверки слов типа Boggle с помощью jQuery. Вариант заключается в том, что букву можно использовать более одного раза, а доска всегда состоит из двух строк.
Я использовал строку, разделенную пополам, как «доску», и использовал рекурсивную функцию для поиска заданного слова. Я просмотрел подобные примеры, но не могу правильно закодировать функцию.
Например, если строка доски OMRAWNLET
. Доска будет выглядеть так:
O M R A W
N L E T
Он вернет true
, если искомое слово будет watermelon
. Может ли кто-нибудь помочь мне или написать функцию? Спасибо.
Извините, что не опубликовал мой код. Думаю, я просто смутился.
Я бы использовал двумерный массив для доски и массив букв для слова. Вот быстрый прототип:
var isWordOnTheBoard = function(board, word) {
var passedTest = true;
var previousLetterCoordinates;
//written as a loop; rewrite to use recursion
for (let letter of word) {
// console.info('current letter is ' + letter);
var letterCoordinates = getCoordinatesOnTheBoard(board, letter);
if (!letterCoordinates){
passedTest = false;
console.info('letter ' + letter + ' is not on the board');
break;
}
if (previousLetterCoordinates && !areNeighbors(previousLetterCoordinates, letterCoordinates)){
passedTest = false;
console.info('letter ' + letter + ' is not a neighbor to the previous letter');
break;
}
previousLetterCoordinates = letterCoordinates;
}
return passedTest;
};
//assumes letters on the board are unique with no repeated letters
var getCoordinatesOnTheBoard = function(board, letter) {
//undefined means letter is not on the board
var coordinates;
var firstRowIndex = board[0].indexOf(letter);
if (firstRowIndex >= 0){
coordinates = {
row: 0,
column: firstRowIndex
};
}
var secondRowIndex = board[1].indexOf(letter);
if (secondRowIndex >= 0){
coordinates = {
row: 1,
column: secondRowIndex
};
}
return coordinates;
}
//neighbors of a:
// | NW | N | NE |
// | W | a | E |
// | SW | S | SE |
// where NW is North West, N is North, NE is North East and so on
var areNeighbors = function(a, b) {
var nw_of_a = {
row: a.row - 1,
column: a.column - 1
}
if (JSON.stringify(b) === JSON.stringify(nw_of_a)){return true}
var n_of_a = {
row: a.row - 1,
column: a.column
}
if (JSON.stringify(b) === JSON.stringify(n_of_a)){return true}
var ne_of_a = {
row: a.row - 1,
column: a.column + 1
}
if (JSON.stringify(b) === JSON.stringify(ne_of_a)){return true}
var e_of_a = {
row: a.row,
column: a.column + 1
}
if (JSON.stringify(b) === JSON.stringify(e_of_a)){return true}
var se_of_a = {
row: a.row + 1,
column: a.column + 1
}
if (JSON.stringify(b) === JSON.stringify(se_of_a)){return true}
var s_of_a = {
row: a.row + 1,
column: a.column
}
if (JSON.stringify(b) === JSON.stringify(s_of_a)){return true}
var sw_of_a = {
row: a.row + 1,
column: a.column - 1
}
if (JSON.stringify(b) === JSON.stringify(sw_of_a)){return true}
var w_of_a = {
row: a.row,
column: a.column - 1
}
if (JSON.stringify(b) === JSON.stringify(w_of_a)){return true}
return false;
}
var omraw_nlet = [
['O','M','R','A','W'],
['N','L','E','T']
];
var watermelon = ['W', 'A', 'T', 'E', 'R', 'M', 'E', 'L', 'O', 'N'];
var lemon = ['L', 'E', 'M', 'O', 'N'];
console.info(isWordOnTheBoard(omraw_nlet, watermelon)); //true
console.info(isWordOnTheBoard(omraw_nlet, ['W', 'A', 'R'])); //true
console.info(isWordOnTheBoard(omraw_nlet, lemon)); //true
console.info(isWordOnTheBoard(omraw_nlet, lemon.concat(['S']))); //false
console.info(isWordOnTheBoard(omraw_nlet, ['T', 'E', 'N'])); //false
Спасибо, что нашли время, чтобы закодировать это. Это поможет мне лучше понять Java.
Если все, что вы хотите проверить, это правильность введенного слова на основе букв на доске, вы можете сделать это довольно просто. Просто передайте буквы в виде массива и введите в виде строки. Оттуда просто ищите букву за буквой через ввод, чтобы увидеть, есть ли она в массиве букв.
function validate_input(letters, input){
input = input.toUpperCase();
var errors = input.split("").filter(function(letter){
return (letters.indexOf(letter) == -1);
});
return (errors == "");
}
var letters = ["O","M","R","A","W","N","L","E","T"];
console.info(validate_input(letters, "lemfon"));
console.info(validate_input(letters, "watermelon"));
Stack Overflow — это нет служба написания кода. Мы всегда рады помочь и поддержать новых программистов, но сначала вам нужно помочь себе, проведя небольшое исследование по этому вопросу и попытавшись написать код. Если у вас есть проблемы с этим кодом, не стесняйтесь задавать вопрос, запрашивая помощь по отладке. Прочтите Как создать минимальный, полный и проверяемый пример.