Показать сообщение отдельно
  #1 (permalink)  
Старый 21.10.2015, 19:50
Новичок на форуме
Отправить личное сообщение для Panwo Посмотреть профиль Найти все сообщения от Panwo
 
Регистрация: 29.04.2015
Сообщений: 6

что делают функции
function getLetters(a)
{
  var letters = new Array();
  var i, j;
  Array.prototype.hasObject = (
    !Array.indexOf ? function (o)
    {
      var l = this.length + 1;
      while (l -= 1) {
        if (this[l - 1] === o) return true;
      }
      return false;
    } : function (o)
    {
      return (this.indexOf(o) !== -1);
    }
  );
  for (i = 0; i < 5; i++) {
    for (j = 0; j < 5; j++) {
      if (a[i][j] && !letters.hasObject(a[i][j])) {
        letters.push(a[i][j]);
      }
    }
  }
  return letters;
}


Что делает эта функция? Похоже на проверку на наличие чего то в массиве, только чего?

И каков принцип работы if (a[i][j])? выполнить если a[i][j] содержит не 0?

Полный код:
function showError(s)
{
  document.getElementById('result').innerHTML = '<p>' + 'Ошибка: ' + s + '</p>';
}

function getPossibleLetters(a, letters, x, y)
{
  var used = new Array();
  var possible = new Array();
  var i;
  for (i = 0; i < 5; i++) {
    if (i != x && a[i][y] && !used.hasObject(a[i][y]))
        used.push(a[i][y]);
    if (i != y && a[x][i] && !used.hasObject(a[x][i]))
        used.push(a[x][i]);
  }
  if (x == y) {
    for (i = 0; i < 5; i++) {
      if (i != x && a[i][i] && !used.hasObject(a[i][i]))
        used.push(a[i][i]);
    }
  }
  if (x == 4 - y) {
    for (i = 0; i < 5; i++) {
      if (i != x && a[i][4-i] && !used.hasObject(a[i][4-i]))
        used.push(a[i][4-i]);
    }
  }
  for (i = 0; i < letters.length; i++) {
    if (!used.hasObject(letters[i]))
      possible.push(letters[i]);
  }
  return possible;
}

function checkCorrectness(a, letters)
{
  var i, j;
  for (i = 0; i < 5; i++) {
    for (j = 0; j < 5; j++) {
      if (a[i][j] && !getPossibleLetters(a, letters, i, j).hasObject(a[i][j]))
        return false;
    }
  }
  return true;
}

// Делаем очередной шаг решения.
// Возвращаемые значения:
//  0 - задача решена (не осталось пустых клеток)
//  1 - нет однозначного решения
//  2 - нет решений
//  3 - удалось успешно сделать шаг (вставить одну из букв на нужное место)
function makeOneStep(a, letters)
{
  var i, j;
  var empty = 0;
  var possible;
  for (i = 0; i < 5; i++) {
    for (j = 0; j < 5; j++) {
      if (a[i][j]) continue;
      empty++;
      possible = getPossibleLetters(a, letters, i, j);
      if (possible.length == 0) return 2;
      if (possible.length == 1) {
        a[i][j] = possible[0];
        return 3;
      }
    }
  }
  if (empty == 0) return 0;
  return 1;
}

function showSolution(a)
{
  var s = '<p>Решение:</p><table border="1">';
  var i, j;
  for (i = 0; i < 5; i++) {
    s += '<tr><th>' + (5 - i) + '</th>';
    for (j = 0; j < 5; j++)
      s += '<td><input type="text" size=1 readonly="readonly" value="' + a[i][j] + '" /></td>';
    s += '</tr>';
  }
  s += '<tr><th>&nbsp;&emsp;&nbsp;</th>' +
       '<th>a</th><th>b</th><th>c</th><th>d</th><th>e</th></tr>' +
       '</table>';
  document.getElementById('result').innerHTML = s;
}

function getLetters(a)
{
  var letters = new Array();
  var i, j;
  Array.prototype.hasObject = (
    !Array.indexOf ? function (o)
    {
      var l = this.length + 1;
      while (l -= 1) {
        if (this[l - 1] === o) return true;
      }
      return false;
    } : function (o)
    {
      return (this.indexOf(o) !== -1);
    }
  );
  for (i = 0; i < 5; i++) {
    for (j = 0; j < 5; j++) {
      if (a[i][j] && !letters.hasObject(a[i][j])) {
        letters.push(a[i][j]);
      }
    }
  }
  return letters;
}

function solve()
{
  var inputs = document.getElementsByTagName("input");
  var a = new Array(5);
  var i, j;
  var letters;
  var status;
  for (i = 0; i < 5; i++) {
    a[i] = new Array(5);
    for (j = 0; j < 5; j++)
      a[i][j] = inputs[i*5 + j].value.toUpperCase();
  }
  letters = getLetters(a);
  if (letters.length != 5) {
    showError('количество различных букв в сквэрворде должно быть равно пяти.');
    return false;
  }
  if (!checkCorrectness(a, letters)) {
    showError('исходное задание не удовлетворяет правилам построения сквэрворда.');
    return false;
  }
  do {
    status = makeOneStep(a, letters);
    if (status == 1) {
      showError('задача не имеет однозначного решения.');
      return false;
    }
    if (status == 2) {
      showError('задача не имеет решения.');
      return false;
    }
  } while (status);
  showSolution(a);
  return false;
}
</script>


И как можно весь код пошагово посмотреть в отладчике?
Ответить с цитированием