@Comnox

Где ошибка в алгоритме нахождения кратчайшего пути для набора текста?

Не могу найти ошибку в алгоритме поиска наименьшего количества действий/шагов при наборе слова так сказать на клавиатуре мобильного телефона:

61c32b65c1041864139320.png

function findShortestWay(text) {
        const sign_arr = [
          ["1"],
          ["2", "a", "b", "c"],
          ["3", "d", "e", "f"],
          ["4", "g", "h", "i"],
          ["5", "j", "k", "l"],
          ["6", "m", "n", "o"],
          ["7", "p", "q", "r", "s"],
          ["8", "t", "u", "v"],
          ["9", "w", "x", "y", "z"],
        ];

        let current_coords = [0, 0];
        let register = 0; //caps lock
        let steps = 0;

        input_arr = text.split("");
        input_arr.forEach((item) => {
          if (
            isNaN(parseInt(item)) &&
            register != (item.toString().toUpperCase() === item ? 1 : 0)
          ) {
            //проверяем сменился ли регистр
            register = item.toString().toUpperCase() === item ? 1 : 0; //если сменился, то меняем флаг
            steps += step_amount(current_coords, [3, 4]) + 1; //прибавляем шаги до кнопки смены регистра + само нажатие на кнопку
            current_coords = [3, 4]; //меняем текущие координаты
          }

          let i = item.toLowerCase();
          let pos_in_arr; //иначе говоря порядковый номер кнопки с искомой буквой
          let inner_index; //позиция буквы на кнопке

          sign_arr.forEach((item, index) => {
            //поиск во вложенных массивах
            let inner = item.indexOf(i);
            if (inner >= 0) {
              pos_in_arr = index;
              inner_index = inner;
            }
          });
          let target_coords = [pos_in_arr % 3, Math.floor(pos_in_arr / 3)];
          steps +=
            step_amount(current_coords, target_coords) + 1 + inner_index + 1;
        });
        return steps;
      }
      function step_amount(start, end) {
        let steps = 0;
        if (start[0] - end[0] != 0) steps++; // по оси х нужная координата всегда достигается 1 шагом, если она уже не достигнута
        if (start[1] - end[1] != 0) {
          //по оси У если разница по модулю равна 2 то 2 шага, иначе 1 шаг
          if (Math.abs(start[1] - end[1]) != 2) steps++;
          else steps = steps + 2;
        }
        return Number(steps);
      }

      console.log(findShortestWay("C")); // 10
      console.log(findShortestWay("12345")); // 15
      console.log(findShortestWay("mobileremote")); // должно быть 71, у меня 70
      console.log(findShortestWay("MobileRemote")); // должно быть 87, у меня 82
    },
  • Вопрос задан
  • 73 просмотра
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы