Показать сообщение отдельно

Задачка-головоломка
  #1  
Старый 28.11.2007, 11:03
Дикс
Познавший АНТИЧАТ
Регистрация: 16.04.2006
Сообщений: 1,488
Провел на форуме:
2209675

Репутация: 537


По умолчанию Задачка-головоломка

Вместо того чтобы учить студентов первых-вторых курсов информатике, нам сунули в зубы *censored* учебник какого-то препода, в котором задачки не столько на знание Си, сколько на соответствие уровню умственного развития как минимум Шерлока Холмса или блин Цезаря и кто там самый умный был =\

Ладно, постараюсь всё обьяснить как можно более внятно.

Задача:
Тема: рекурсивный вызов функции.
11. Разместить на шахматной доске максимальное количество слонов и ладей так,
чтобы они не находились друг у друга " под боем" .

Прога должна вернуть количество ладей и слонов, которым удалось уместиться.

Известно что:
- Ладья, не имея ограничений, может передвигаться на любое расстояние по горизонтали и вертикали.

- Слон ходит по диагонали на любое расстояние.


Первое же препятствие в решении задачи: в какой последовательности ставить слонов и ладьи на доску, так чтобы они заняли всё пространство?
По логике - прогоняем все клетки доски и ставим по очереди то ладью, то слона, так чтобы никто никого не мог сбить. Разделения на белых и чёрных тут нет.

Вот что получается:


Как видите, справа осталось полным полно клеток, куда можно поставить фигуры с сохранением условия.

Как рекурсией обойти и те клетки тоже? =\
Либо надо поменять порядок вставки слонов и ладей, но ведь он вообще нигде не оговорён, как я могу придумывать его? Тогда это уже вообще идиотизм, я не Си изучаю, а шахматы

И вот код, который я набросал:
Код:
#include <stdio.h>


void count(int x, int y, char model, int doska[8][8]){

for(int i=0; i<8; i++)
	for(int j=0; j<8; j++)
		if(doska[i][j] == 1)
			printf("shit");

};



void main(){

	int doska[8][8] = {0};
	doska[2][3] = 1;
	int ladja = 0;
	int slon = 0;

	int x = 0;
	int y = 0;
	
	char model = 'l'; // l = ladja, s = slon

    printf("\nBefore counting: \n\n");
	for(int i=0; i<8; i++)
		for(int j=0; j<8; j++){
					if(j==0)
					printf("\n");
		printf("%d ", doska[i][j]);
		}
    printf("\n\n");

	// start function 
	count(0,0,model, doska);
	// end function

    printf("\n---------------------------------------\nAfter counting: \n\n");
	for(i=0; i<8; i++)
		for(int j=0; j<8; j++){
					if(j==0)
					printf("\n");
		printf("%d ", doska[i][j]);
		}
    printf("\n\nLadja: %d\nSlon: %d\n\n", ladja, slon);


}
мне кажется, надо вызывать функцию рекурсией, поочерёдно задавая её фигуру для вставки, отличную от предыдущей.
Но главная проблема в том, что я не знаю как проверить оставшиеся клетки =\
 
Ответить с цитированием