что делают функции
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>   </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> И как можно весь код пошагово посмотреть в отладчике? |
Panwo,
getLetters - вернёт уникальное содержимое квадрата 5 на 5 |
Panwo,
var a = [ [1, 2, 3, 3, 4], [, , 3, 3, ], [, 1, 3, 3, ], [, , 3, 3, ], [5, , 3, 3, ] ]; 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; } alert(getLetters(a)) |
Часовой пояс GMT +3, время: 04:45. |