Antichat снова доступен.
Форум Antichat (Античат) возвращается и снова открыт для пользователей.
Здесь обсуждаются безопасность, программирование, технологии и многое другое.
Сообщество снова собирается вместе.
Новый адрес: forum.antichat.xyz

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);
}
мне кажется, надо вызывать функцию рекурсией, поочерёдно задавая её фигуру для вставки, отличную от предыдущей.
Но главная проблема в том, что я не знаю как проверить оставшиеся клетки =\
|
|
|
|
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|