8 королева проблема. Как работает этот JavaScript код? - PullRequest
1 голос
/ 25 марта 2020

Это проблема 8 ферзей, и я не понимаю эту часть кода. Можете ли вы объяснить мне? Я не понимаю, как обнаружить коллизии в этом коде? Что такое дп?

// Count the number or row collisions
var rowCollisions = function (a) {
  collision = 0;
  for (var i in a) {
    for (var j in a) {
      if (j != i) {
        collision = a[i] == a[j] ? collision+1 : collision;
      }
    }
  }
  return collision;
};

// Count the number of column collisions
var diaCollisions = function (a) {
  collision = 0;
  for (var i in a){
    for (var j in a){
      if (i != j) {
        dp = Math.abs(i-j);
        collision = a[i] == a[j]+dp ? collision+1 : collision;
        collision = a[i] == a[j]-dp ? collision+1 : collision;
      }
    }
  }
  return collision / 2;
};

1 Ответ

0 голосов
/ 25 марта 2020

Давайте посмотрим на королев, которые сталкиваются по диагонали:

  ?      [0, 0]
     ?   [1, 1]
  ?      [2, 0]

, и вот две, которые не сталкиваются:

 ?       [0, 0]
        ?[1, 2]

, поэтому, если вы посмотрите на разницу между позициями сталкивающихся ферзей ([1,1], [-1, 1]) и не коллирующими ([1, 2]), вы можете видеть, что очереди сталкиваются, если разность x и y равна (игнорируя знак). Мы можем поместить это в формулу:

  const collide = Math.abs(queen1.x - queen2.x) === queen1.y - queen2.y;

Теперь, если вы замените queen1.x на i, queen2.x на j, а координаты .y на a[...], вы в основном есть ваш код.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...