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>
И как можно весь код пошагово посмотреть в отладчике?