#include <cstdlib>
#include <iostream>
using namespace std;
const int COUNT_EL = 8 , WIDTH = 8 , HEIGHT = 8 ;
const bool SET_DIA = true /*для установки диагонали*/ , DEL_DIA = false /*для удаления диагонали*/ ;
int a[ HEIGHT] [ WIDTH] ; // доска
bool is_set[ HEIGHT] [ WIDTH] ; // Расположение слонов на доске
int count_null = WIDTH * HEIGHT; // Количество пустых клеток
bool isEnd = false ; // Флаг выхода из рекурсии
const bool FIRST = true , SECOND = false ; // индификация диагоналей
int diagonal( bool is_firstD, bool set, int x, int y, int i, int j) { // осуществляет все операции с диагоналями
while ( y< HEIGHT && ( is_firstD? ( x< WIDTH) : ( x >= 0 ) ) ) { // заполняем/очищаем первую\вторую диагональ
if ( is_firstD? true : x ! = j || y ! = i) {
if ( set) {
a[ y] [ x] ++ ;
if ( a[ y] [ x] == 1 ) {
count_null-- ;
}
} else {
a[ y] [ x] -- ;
if ( a[ y] [ x] == 0 ) {
count_null++ ;
}
}
}
x + = ( is_firstD? 1 : - 1 ) ;
y++ ;
}
}
int space( bool set, int level, int i, int j) { // функция осуществляет операции с диагналями (установку \ удалене)
is_set[ i] [ j] = set;
int x, y;
if ( j> i) { // ищем начало прохода первой диагнали (параллельной или индентичной главной)
y = 0 ;
x = j- i;
} else {
x = 0 ;
y = i- j;
}
diagonal( FIRST, set, x, y, i, j) ;
// ищем начало второй диагонали (перпендикулярной главной (побочной))
int sum = i+ j;
if ( sum < WIDTH) {
x = sum;
y = 0 ;
} else {
x = WIDTH- 1 ;
y = sum- x;
}
diagonal( SECOND, set, x, y, i, j) ;
}
bool find_permutation( int level= 0 ) { // функция ищет все варианты установки слонов рекурсивно (если расставлен не 8-й слон, то расставляет остальных)(данный слон задается переменной level (0..7))
level++ ;
for ( int i = level- 1 , j = ( level== 1 ? 1 : 0 ) ; j < WIDTH ; j++ ) {
/*экспериментально было замечено, что при установки первого слона в самом начале строки нужных нам последовательносте найдено не будет
именно по этой причине если мы задаем первого слона, то начинаем со второй ячейки строки (это намного ускоряет поиск)
*/
if ( a[ i] [ j] == 0 ) {
space( SET_DIA, level, i, j) ;
if ( level ! = COUNT_EL) {
find_permutation( level) ;
if ( isEnd) {
return false ;
}
} else if ( count_null == 0 ) {
cout << "Ответ найден:" << endl << endl;
for ( int i1= 0 ; i1< HEIGHT ; i1++ ) {
for ( int j1= 0 ; j1< WIDTH ; j1++ ) {
cout << ( is_set[ i1] [ j1] ? 1 : 0 ) << ( j1+ 1 == WIDTH ? '\n ' : ' ' ) ;
}
}
isEnd = true ;
return false ;
}
space( DEL_DIA, level, i, j) ;
}
}
level-- ;
}
int main( ) {
find_permutation( ) ;
}
I2luY2x1ZGUgPGNzdGRsaWI+CiNpbmNsdWRlIDxpb3N0cmVhbT4KIAp1c2luZyBuYW1lc3BhY2Ugc3RkOwogCmNvbnN0IGludCBDT1VOVF9FTCA9IDgsIFdJRFRIID0gOCwgSEVJR0hUID0gODsKY29uc3QgYm9vbCBTRVRfRElBID0gdHJ1ZS8q0LTQu9GPINGD0YHRgtCw0L3QvtCy0LrQuCDQtNC40LDQs9C+0L3QsNC70LgqLywgREVMX0RJQSA9IGZhbHNlLyrQtNC70Y8g0YPQtNCw0LvQtdC90LjRjyDQtNC40LDQs9C+0L3QsNC70LgqLzsKaW50IGFbSEVJR0hUXVtXSURUSF07CQkJCQkJCS8vINC00L7RgdC60LAKYm9vbCBpc19zZXRbSEVJR0hUXVtXSURUSF07CQkJCQkJLy8g0KDQsNGB0L/QvtC70L7QttC10L3QuNC1INGB0LvQvtC90L7QsiDQvdCwINC00L7RgdC60LUKaW50IGNvdW50X251bGwgPSBXSURUSCAqIEhFSUdIVDsJCQkJLy8g0JrQvtC70LjRh9C10YHRgtCy0L4g0L/Rg9GB0YLRi9GFINC60LvQtdGC0L7Qugpib29sIGlzRW5kID0gZmFsc2U7CQkJCQkJCQkvLyDQpNC70LDQsyDQstGL0YXQvtC00LAg0LjQtyDRgNC10LrRg9GA0YHQuNC4CmNvbnN0IGJvb2wgRklSU1QgPSB0cnVlLCBTRUNPTkQgPSBmYWxzZTsJCS8vINC40L3QtNC40YTQuNC60LDRhtC40Y8g0LTQuNCw0LPQvtC90LDQu9C10LkKIAppbnQgZGlhZ29uYWwoYm9vbCBpc19maXJzdEQsIGJvb2wgc2V0LCBpbnQgeCwgaW50IHksIGludCBpLCBpbnQgail7CQkJCS8vINC+0YHRg9GJ0LXRgdGC0LLQu9GP0LXRgiDQstGB0LUg0L7Qv9C10YDQsNGG0LjQuCDRgSDQtNC40LDQs9C+0L3QsNC70Y/QvNC4Cgl3aGlsZSh5PEhFSUdIVCAmJiAoaXNfZmlyc3REPyAoeDxXSURUSCkgOiAoeCA+PSAwKSkpewkJCQkJLy8g0LfQsNC/0L7Qu9C90Y/QtdC8L9C+0YfQuNGJ0LDQtdC8INC/0LXRgNCy0YPRjlzQstGC0L7RgNGD0Y4g0LTQuNCw0LPQvtC90LDQu9GMCgkJaWYoaXNfZmlyc3REPyB0cnVlIDogeCAhPSBqIHx8IHkgIT0gaSl7CgkJCWlmKHNldCl7CQkJCQkJCQkJCQkJCQkJCQoJCQkJYVt5XVt4XSsrOwoJCQkJaWYoYVt5XVt4XSA9PSAxKXsJCQkJCQkJCQkJCQkJCgkJCQkJY291bnRfbnVsbC0tOwoJCQkJfQoJCQl9ZWxzZXsJCQkJCQkJCQkJCQkJCQkJCQoJCQkJYVt5XVt4XS0tOwoJCQkJaWYoYVt5XVt4XSA9PSAwKXsJCQkJCQkJCQkJCQkKCQkJCQljb3VudF9udWxsKys7CgkJCQl9CgkJCX0KCQl9CgkJeCArPSAoaXNfZmlyc3REPyAxIDogLTEpOwoJCXkrKzsKCX0KfQogCmludCBzcGFjZShib29sIHNldCwgaW50IGxldmVsLCBpbnQgaSwgaW50IGopewkJLy8g0YTRg9C90LrRhtC40Y8g0L7RgdGD0YnQtdGB0YLQstC70Y/QtdGCINC+0L/QtdGA0LDRhtC40Lgg0YEg0LTQuNCw0LPQvdCw0LvRj9C80LggKNGD0YHRgtCw0L3QvtCy0LrRgyBcINGD0LTQsNC70LXQvdC1KQoJaXNfc2V0W2ldW2pdID0gc2V0OwkJCQkJCQkJCglpbnQgeCwgeTsKCWlmKGo+aSl7CQkJCQkJCQkJCS8vINC40YnQtdC8INC90LDRh9Cw0LvQviDQv9GA0L7RhdC+0LTQsCDQv9C10YDQstC+0Lkg0LTQuNCw0LPQvdCw0LvQuCAo0L/QsNGA0LDQu9C70LXQu9GM0L3QvtC5INC40LvQuCDQuNC90LTQtdC90YLQuNGH0L3QvtC5INCz0LvQsNCy0L3QvtC5KQoJCXkgPSAwOwoJCXggPSBqLWk7Cgl9ZWxzZXsKCQl4ID0gMDsKCQl5ID0gaS1qOwoJfQoJZGlhZ29uYWwoRklSU1QsIHNldCwgeCwgeSwgaSwgaik7CgkvLyDQuNGJ0LXQvCDQvdCw0YfQsNC70L4g0LLRgtC+0YDQvtC5INC00LjQsNCz0L7QvdCw0LvQuCAo0L/QtdGA0L/QtdC90LTQuNC60YPQu9GP0YDQvdC+0Lkg0LPQu9Cw0LLQvdC+0LkgKNC/0L7QsdC+0YfQvdC+0LkpKQoJaW50IHN1bSA9IGkrajsKCWlmKHN1bSA8IFdJRFRIKXsKCQl4ID0gc3VtOwoJCXkgPSAwOwoJfWVsc2V7CgkJeCA9IFdJRFRILTE7CgkJeSA9IHN1bS14OwoJfQoJZGlhZ29uYWwoU0VDT05ELCBzZXQsIHgsIHksIGksIGopOwp9CiAKYm9vbCBmaW5kX3Blcm11dGF0aW9uKGludCBsZXZlbD0wKXsJCS8vINGE0YPQvdC60YbQuNGPINC40YnQtdGCINCy0YHQtSDQstCw0YDQuNCw0L3RgtGLINGD0YHRgtCw0L3QvtCy0LrQuCDRgdC70L7QvdC+0LIg0YDQtdC60YPRgNGB0LjQstC90L4gKNC10YHQu9C4INGA0LDRgdGB0YLQsNCy0LvQtdC9INC90LUgOC3QuSDRgdC70L7QvSwg0YLQviDRgNCw0YHRgdGC0LDQstC70Y/QtdGCINC+0YHRgtCw0LvRjNC90YvRhSko0LTQsNC90L3Ri9C5INGB0LvQvtC9INC30LDQtNCw0LXRgtGB0Y8g0L/QtdGA0LXQvNC10L3QvdC+0LkgbGV2ZWwgKDAuLjcpKQoJbGV2ZWwrKzsKIAoJZm9yKGludCBpID0gbGV2ZWwtMSwgaiA9IChsZXZlbD09MT8xOjApOyBqIDwgV0lEVEggOyBqKyspewkJCQkJCgkvKtGN0LrRgdC/0LXRgNC40LzQtdC90YLQsNC70YzQvdC+INCx0YvQu9C+INC30LDQvNC10YfQtdC90L4sINGH0YLQviDQv9GA0Lgg0YPRgdGC0LDQvdC+0LLQutC4INC/0LXRgNCy0L7Qs9C+INGB0LvQvtC90LAg0LIg0YHQsNC80L7QvCDQvdCw0YfQsNC70LUg0YHRgtGA0L7QutC4INC90YPQttC90YvRhSDQvdCw0Lwg0L/QvtGB0LvQtdC00L7QstCw0YLQtdC70YzQvdC+0YHRgtC1INC90LDQudC00LXQvdC+INC90LUg0LHRg9C00LXRggoJICDQuNC80LXQvdC90L4g0L/QviDRjdGC0L7QuSDQv9GA0LjRh9C40L3QtSDQtdGB0LvQuCDQvNGLINC30LDQtNCw0LXQvCDQv9C10YDQstC+0LPQviDRgdC70L7QvdCwLCDRgtC+INC90LDRh9C40L3QsNC10Lwg0YHQviDQstGC0L7RgNC+0Lkg0Y/Rh9C10LnQutC4INGB0YLRgNC+0LrQuCAo0Y3RgtC+INC90LDQvNC90L7Qs9C+INGD0YHQutC+0YDRj9C10YIg0L/QvtC40YHQuikKCSovCgkJaWYoYVtpXVtqXSA9PSAwKXsJCQkKCQkJc3BhY2UoU0VUX0RJQSwgbGV2ZWwsIGksIGopOwkJCQkJCQoJCQlpZihsZXZlbCAhPSBDT1VOVF9FTCl7CQkJCQkJCQkJCQkKCQkJCWZpbmRfcGVybXV0YXRpb24obGV2ZWwpOwkJCQkJCQkJCQkJCgkJCQlpZihpc0VuZCl7CQkJCQkJCQkJCQkJCQoJCQkJCXJldHVybiBmYWxzZTsKCQkJCX0KCQkJfWVsc2UgaWYoY291bnRfbnVsbCA9PSAwKXsJCQkJCQkJIAoJCQkJY291dCA8PCAi0J7RgtCy0LXRgiDQvdCw0LnQtNC10L06Ijw8IGVuZGwgPDwgZW5kbDsJCQkJCQoJCQkJZm9yKCBpbnQgaTE9MCA7IGkxPEhFSUdIVCA7IGkxKysgKXsJCQkJCQoJCQkJCWZvciggaW50IGoxPTAgOyBqMTxXSURUSCA7IGoxKysgKXsKCQkJCQkJY291dCA8PCAoaXNfc2V0W2kxXVtqMV0/IDEgOiAwKSA8PCAoajErMSA9PSBXSURUSCA/ICdcbicgOiAnICcgKTsKCQkJCQl9CgkJCQl9CgkJCQlpc0VuZCA9IHRydWU7CQkJCQkJCQkJCQkKCQkJCXJldHVybiBmYWxzZTsJCQkJCQkJCQkJCgkJCX0KCQkJc3BhY2UoREVMX0RJQSwgbGV2ZWwsIGksIGopOwkJCQkJCQkJCgkJfQogCgl9CglsZXZlbC0tOwp9CiAKaW50IG1haW4oKXsKCWZpbmRfcGVybXV0YXRpb24oKTsKfQ==