Ход коня (BFS алгоритм)

Вопрос аналогичен в тему Задача о перемещении шахматного коня на доске , надо найти за сколько ходов конь переместится в указанные координаты.

Программа выдает не правильную цифру**

 function solution(x){
    var arr = ["a","b","c","d",'e',"f","g",'h']
    let dx = [2,2,-2,-2,1,1,-1,-1]
    let dy = [-1,1,1,-1,2,-2,2,-2]
    board = []
    for (var i = 0; i < 8; i++) {
        let tox = []
        board.push(tox)
        for (var j = 0; j < 8; j++) {
            board[i][j] = 0 // заполняем доску нулями
        }
    }
    var x1 = arr.indexOf(x[0][0].toLowerCase())+1 // координаты начальной позиции коня
    var x2 = Number(x[0][1])
    board[x1-1][x2-1] = 1;      //получить координаты и поставить на доске 1
    var y1 = arr.indexOf(x[1][0].toLowerCase())+1 // координаты конечной позиции
    var y2 = Number(x[1][1])
    let xod = []      //сделаные ходы
    let way = []
    //очередь которая содержит: текущие координаты, количество ходов, чтобы
    //добратся до даной клетки, и список всех проделаных ходов для вывода
    way.push([x1-1, x2-1],xod)     //добавляем в очередь текущее положение и никакой ход
    while(!way.length==0){      //пока очередь не пуста
        now = way[0]        //на какой клетке находимся сейчас
        xod = [way[0]]    //какие ходы были сделаны до этого
        if(now[0] == y1-1 && now[1] == y2-1) {break}   
        //если сейчас находимся на конечной клетке - выход из цикла
            way.pop();     // удалить текущий элемент
            for (let d = 0; d < 8; d++) {
            if(now[0]+dx[d] < 8 && now[0]+dx[d] >= 0 &&
                now[1]+dy[d] < 8 && now[1]+dy[d] >= 0 &&
                board[now[0]+dx[d]][now[1]+dy[d]] == 0){ 
                //если координаты не превышают 8 и не меньше 0, и на этой клетке ещё не был
                let xod2 = xod
                xod2.push([now[0]+dx[d], now[1]+dy[d]]);
                way.push([now[0]+dx[d], now[1]+dy[d]], xod2);
                //заталкиваем в очередь пару из новых координат и проделаных ходов
                board[now[0]+dx[d]][now[1]+dy[d]] = 1;
                //клетку отмечаем 1
            }               
        }
    } return xod.length   // Необходимое количество ходов
}
    console.log(solution(["D5","F1"]))//2
    console.log(solution(["D5","E3"]))//1
    console.log(solution(["C3","B5"]))//1
    console.log(solution(["D5","H7"]))//2


Ответы (1 шт):

Автор решения: Трипольский Пётр

А вы не пробовали попробовать написать это на JavaScript, а не на Си?

В каждой шутке доля шутки

(function() {

    const MAX_STEPS = 3;
    const MAX_ROADS = 5;

    const copy = (area) => area.slice(0).map((line) => line.slice(0)); 
    const printArea = (arr) => [...arr].forEach((line) => console.log(line.join(' ') + '\n'));
    const arr = (m) => [...new Array(8)].reduce((acm) => [...acm, acm.length], []).map(m);
    const area = arr((i) => i % 2 === 0 ? arr(j => j % 2 === 0 ? 1 : 0) : arr(j => j % 2 === 0 ? 0 : 1));

    const inRange = (x,y) => {
      if (x < 0 || x > area.length) {
        return false;
      } else if (y < 0 || y > area[0].length) {
        return false;
      } else {
        return true;
      }
    };

    const step = (x,y) => [
      [x + 1, y - 2],
      [x + 2, y - 1],
      [x + 1, y + 2],
      [x + 2, y + 1],
      [x - 1, y - 2],
      [x - 2, y - 1],
      [x - 1, y + 2],
      [x - 2, y + 1]
    ].filter(([x, y]) => inRange(x,y))
    
    const draw = (steps = ["0:1", "2:2", "1:0"]) => steps
      .reduce((acm, cur) => [...acm, [steps[acm.length - 1], cur]], []).slice(1)
      .map((dots) => dots.map((d) => d.split(':').map((cell) => parseInt(cell))))
      .forEach(([from, to]) => {

        const way = copy(area);
        const [x1, y1] = from;
        const [x2, y2] = to;

        way[y1][x1] = 'x';
        way[y2][x2] = 'x';

        console.warn(`${x1} ${y1} => ${x2} ${y2}`);
        printArea(way);
      });

    const bfs = ({x1, y1}, {x2, y2}) => {

      const roads = [];

      const process = (dot = [x1, y1], ignore = new Set(), way = []) => {

          const [x, y] = dot;

          const n = `${x}:${y}`;
          ignore.add(n);
          way.push(n);

          if (x === x2 && y === y2) {
            roads.push(way);
            return;
          }

          if (way.length > MAX_STEPS) {
            return;
          }

          if (roads.length > MAX_ROADS) {
            return;
          }

          step(x, y)
            .filter(([x, y]) => !ignore.has(`${x}:${y}`))
            .forEach((cell) => process(cell, new Set([...ignore]), way.slice(0)));
      };

      process();

      return roads;
    };

    const roads = bfs({x1: 0, y1: 1}, {x2: 1, y2: 0}).sort((a, b) => a.length - b.length);
    const [road] = roads;
    draw(road);

})();

введите сюда описание изображения

→ Ссылка