/*Sergey Kondrashov http://i...content-available-to-author-only...a.ru/
Case Study 3
JavaScript version of the exercise as alternative solution the task from the book Timothy A. Budd, An Introduction to
Object-Oriented Programming http://w...content-available-to-author-only...e.edu/~budd/Books/oopintro2e/
Задача о Восьми ферзях. Вариация решения на JavaScript задачи, предложенной Т. Баддом в книге "" http://w...content-available-to-author-only...e.edu/~budd/Books/oopintro2e/Russian.html
*/
function Queen( column, QueenObj) {
// поля данных
this .row = 1 ;
this .column = column;
this .neighbor = QueenObj;
// поиск и печать решения
this .findSolution = function ( ) {
// проверить позицию, не атакуют ли соседи
while( this .neighbor && this .neighbor .canAttack ( this .row , this .column ) ) {
if ( ! this .advance ( ) )
return false ;
}
//решение найдено
return true ;
}
this .advance = function ( ) {
if ( this .row < 8 ) {
this .row ++;
return this .findSolution ( ) ;
}
if ( this .neighbor && ! this .neighbor .advance ( ) )
return false ;
this .row = 1 ;
return this .findSolution ( ) ;
}
this .print = function ( ) {
if ( this .neighbor )
this .neighbor .print ( ) ;
print( "column == " + this .column + " row == " + this .row ) ;
}
// внутренний метод
this .canAttack = function ( testRow, testColumn) {
// проверка горизонтали
if ( this .row == testRow)
return true ;
// проверка диагоналей
var columnDifference = testColumn - this .column
if ( ( this .row + columnDifference == testRow) || ( this .row - columnDifference == testRow) )
return true ;
// попробовать соседа
return ( this .neighbor && this .neighbor .canAttack ( testRow, testColumn) ) ;
}
return this ;
}
function main( ) {
var lastQueen = 0 ;
for ( var i = 1 ; i <= 8 ; i++ ) {
lastQueen = new Queen( i, lastQueen) ;
if ( ! lastQueen.findSolution ( ) )
print( "no solution" ) ;
}
lastQueen.print ( ) ;
}
main( ) ;
LypTZXJnZXkgS29uZHJhc2hvdiBodHRwOi8vaS4uLmNvbnRlbnQtYXZhaWxhYmxlLXRvLWF1dGhvci1vbmx5Li4uYS5ydS8KICBDYXNlIFN0dWR5IDMKICBKYXZhU2NyaXB0IHZlcnNpb24gb2YgdGhlIGV4ZXJjaXNlIGFzIGFsdGVybmF0aXZlIHNvbHV0aW9uIHRoZSB0YXNrIGZyb20gdGhlIGJvb2sgVGltb3RoeSBBLiBCdWRkLCBBbiBJbnRyb2R1Y3Rpb24gdG8KT2JqZWN0LU9yaWVudGVkIFByb2dyYW1taW5nIGh0dHA6Ly93Li4uY29udGVudC1hdmFpbGFibGUtdG8tYXV0aG9yLW9ubHkuLi5lLmVkdS9+YnVkZC9Cb29rcy9vb3BpbnRybzJlLwogINCX0LDQtNCw0YfQsCDQviDQktC+0YHRjNC80Lgg0YTQtdGA0LfRj9GFLiDQktCw0YDQuNCw0YbQuNGPINGA0LXRiNC10L3QuNGPINC90LAgSmF2YVNjcmlwdCDQt9Cw0LTQsNGH0LgsINC/0YDQtdC00LvQvtC20LXQvdC90L7QuSDQoi4g0JHQsNC00LTQvtC8INCyINC60L3QuNCz0LUgIiIgaHR0cDovL3cuLi5jb250ZW50LWF2YWlsYWJsZS10by1hdXRob3Itb25seS4uLmUuZWR1L35idWRkL0Jvb2tzL29vcGludHJvMmUvUnVzc2lhbi5odG1sCiovCgpmdW5jdGlvbiBRdWVlbihjb2x1bW4sIFF1ZWVuT2JqKXsKCS8vINC/0L7Qu9GPINC00LDQvdC90YvRhQoJdGhpcy5yb3cgPSAxOwoJdGhpcy5jb2x1bW4gPSBjb2x1bW47Cgl0aGlzLm5laWdoYm9yID0gUXVlZW5PYmo7CgkvLyDQv9C+0LjRgdC6INC4INC/0LXRh9Cw0YLRjCDRgNC10YjQtdC90LjRjwoJdGhpcy5maW5kU29sdXRpb24gPSBmdW5jdGlvbigpewoJCS8vINC/0YDQvtCy0LXRgNC40YLRjCDQv9C+0LfQuNGG0LjRjiwg0L3QtSDQsNGC0LDQutGD0Y7RgiDQu9C4INGB0L7RgdC10LTQuAoJCXdoaWxlKHRoaXMubmVpZ2hib3IgJiYgdGhpcy5uZWlnaGJvci5jYW5BdHRhY2sodGhpcy5yb3csIHRoaXMuY29sdW1uKSl7CgkJCWlmKCF0aGlzLmFkdmFuY2UoKSkKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCQkJLy/RgNC10YjQtdC90LjQtSDQvdCw0LnQtNC10L3QvgoJCXJldHVybiB0cnVlOwoJCgl9Cgl0aGlzLmFkdmFuY2UgPSBmdW5jdGlvbigpewoJCWlmKHRoaXMucm93IDwgOCl7CgkJCXRoaXMucm93Kys7CgkJCXJldHVybiB0aGlzLmZpbmRTb2x1dGlvbigpOwoJCX0KCQlpZih0aGlzLm5laWdoYm9yICYmICF0aGlzLm5laWdoYm9yLmFkdmFuY2UoKSkKCQkJcmV0dXJuIGZhbHNlOwoJCXRoaXMucm93ID0gMTsKCQlyZXR1cm4gdGhpcy5maW5kU29sdXRpb24oKTsKCX0KCXRoaXMucHJpbnQgPSBmdW5jdGlvbigpewoJCWlmKHRoaXMubmVpZ2hib3IpCgkJCXRoaXMubmVpZ2hib3IucHJpbnQoKTsKCQlwcmludCgiY29sdW1uID09ICIgKyB0aGlzLmNvbHVtbiArICIgcm93ID09ICIgKyB0aGlzLnJvdyk7Cgl9CgkvLyDQstC90YPRgtGA0LXQvdC90LjQuSDQvNC10YLQvtC0Cgl0aGlzLmNhbkF0dGFjayA9IGZ1bmN0aW9uKHRlc3RSb3csIHRlc3RDb2x1bW4pewoJCS8vINC/0YDQvtCy0LXRgNC60LAg0LPQvtGA0LjQt9C+0L3RgtCw0LvQuAoJCWlmKHRoaXMucm93ID09IHRlc3RSb3cpCgkJcmV0dXJuIHRydWU7CgkJLy8g0L/RgNC+0LLQtdGA0LrQsCDQtNC40LDQs9C+0L3QsNC70LXQuQoJCXZhciBjb2x1bW5EaWZmZXJlbmNlID0gdGVzdENvbHVtbiAtIHRoaXMuY29sdW1uCgkJaWYoKHRoaXMucm93ICsgY29sdW1uRGlmZmVyZW5jZSA9PSB0ZXN0Um93KSB8fCAodGhpcy5yb3cgLSBjb2x1bW5EaWZmZXJlbmNlID09IHRlc3RSb3cpKQoJCXJldHVybiB0cnVlOwoJCS8vINC/0L7Qv9GA0L7QsdC+0LLQsNGC0Ywg0YHQvtGB0LXQtNCwCgkJcmV0dXJuICh0aGlzLm5laWdoYm9yICYmIHRoaXMubmVpZ2hib3IuY2FuQXR0YWNrKHRlc3RSb3csIHRlc3RDb2x1bW4pKTsKCX0KcmV0dXJuIHRoaXM7CQp9CgpmdW5jdGlvbiBtYWluKCl7Cgl2YXIgbGFzdFF1ZWVuID0gMDsKCWZvciAodmFyIGkgPSAxOyBpIDw9IDg7IGkrKyl7CgkJbGFzdFF1ZWVuID0gbmV3IFF1ZWVuKGksIGxhc3RRdWVlbik7CgkJaWYoIWxhc3RRdWVlbi5maW5kU29sdXRpb24oKSkKCQkJcHJpbnQoIm5vIHNvbHV0aW9uIik7Cgl9CglsYXN0UXVlZW4ucHJpbnQoKTsKfQptYWluKCk7