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

28.11.2007, 12:00
|
|
Постоянный
Регистрация: 10.10.2006
Сообщений: 316
Провел на форуме: 1572471
Репутация:
152
|
|
Вместо того чтобы учить студентов первых-вторых курсов информатике, нам сунули в зубы *censored* учебник какого-то препода, в котором задачки не столько на знание Си, сколько на соответствие уровню умственного развития как минимум Шерлока Холмса или блин Цезаря и кто там самый умный был =\
ИМХО хороший программист - программист с хорошим нестандартным мышлением.
|
|
|

28.11.2007, 12:16
|
|
Познавший АНТИЧАТ
Регистрация: 16.04.2006
Сообщений: 1,488
Провел на форуме: 2209675
Репутация:
537
|
|
2 Ci5
согласен  тока вот задачу надо решить к зимней сессии
|
|
|

28.11.2007, 13:00
|
|
Постоянный
Регистрация: 10.12.2005
Сообщений: 939
Провел на форуме: 3886281
Репутация:
929
|
|
11. Разместить на шахматной доске максимальное количество слонов и ладей так,
чтобы они не находились друг у друга " под боем" .
У тебя на картинке все ладьи под боем - или "под боем" не должны быть слоны с ладьями а друг с другом можно?
Итог задачи это втиснуть как можно больше "каких нибудь фигур" ну т.е. например 18 слонов это более удачная позиция чем 10 слонов и 2 ладьи???
Или кол во слонов и ладей (ладьев :-)) должно быть одинаковым?
Последний раз редактировалось spider-intruder; 28.11.2007 в 13:08..
|
|
|

28.11.2007, 13:21
|
|
Познавший АНТИЧАТ
Регистрация: 16.04.2006
Сообщений: 1,488
Провел на форуме: 2209675
Репутация:
537
|
|
2 spider-intruder
+1  я сам озадачен подобными вопросами.
У меня на картинке ни один слон не может побить ни одну ладью и наоборот.
Имхо, надо разместить как можно больше и тех и тех.
fucking аффтар учебника *WALL*
|
|
|

28.11.2007, 13:30
|
|
Постоянный
Регистрация: 10.12.2005
Сообщений: 939
Провел на форуме: 3886281
Репутация:
929
|
|
Узнай точно имеет ли право (по условию) тура бить туру ? Или слон слона
Если да тонапиздячб всю доску турами ИЛИ слонами и у ьтя будет ответ 64*0
Если нетто твой рисунок не верен так как тура бьет туру и ставить на 1 линии их нельзя
Мне самому интересно - давай уточни условие и будем писать )))
(это вам не кавычки тулить  )
|
|
|

28.11.2007, 13:37
|
|
Постоянный
Регистрация: 10.12.2005
Сообщений: 939
Провел на форуме: 3886281
Репутация:
929
|
|
Вот что еще заметил (ну это очевидно просто как вариант)
Нельзя размешать 1 фигуру возле другой ближе чем на 2 клетки...ну... т.е.
Так ставить нельзя:
Для туры: Y-тура X- Слон
xxx
xxxxyxxx
xxx
Для слона:
х х
xxx
xyx
xxx
х х
Может сначала разбить поле (иатрицу на подматрицы) 3*3 и как то от этого плясать
ФОРМАТИРОВАНИЕ СДОХЛО! В асю стукни 988686ШЕСТЬ
|
|
|

28.11.2007, 13:50
|
|
Banned
Регистрация: 20.06.2005
Сообщений: 880
Провел на форуме: 4610226
Репутация:
1332
|
|
2spider-intruder естественно сумма фигур имеется ввиду, потому что не было введено понятия цены слона и ладьи.
по теме - не вижу ничего сложного. сложность правда будет не просто оценить, потому что сразу сказать сколько вариантов лишних отметает одна фигура не ясно. с другой стороны тк задача расчитана на первокурсников все должно сводиться к "бездумному" перебору, вот примерный псевдокод:
Код:
int pole[8][8];
int pole_temp[8][8];
...
int sum(int num)
{
int i,j;
int max=0;
//bool ok=false;
for(i=0;i<8;i++)
for(j=0;j<8;j++)
if(pole[i][j]==0)
{
ok=true;
memcpy(&pole_temp[0][0], &pole[0][0], sizeof(pole));
put(i,j,type);
int s1=sum(num+1);
memcpy(&pole[0][0], &pole_temp[0][0], sizeof(pole));
put(i,j,Obratnyi(type)));
int s2=sum(num+1);
memcpy(&pole[0][0], &pole_temp[0][0], sizeof(pole));
if(s2>s1) s1=s2;
if(max<s1) max=s1;
}
//if(!ok) return 0;
return num+max;
}
...
sum(0);
--
put - ставим фигуру и обозначаем клетки, что под "боем", например -1. Obratnyi - если слон, то ладья и наоборот.
--
2spider-intruder  это первый курс, не думайте что от вашего "колледжа" или чего там, от вас потребуют сильных мозгов. и еще, можно ставить ближе чем на две клетки, пример:
*SSSSSSS
********
********
********
********
********
********
*SSSSSSS
S - слоны)
Последний раз редактировалось ZaCo; 28.11.2007 в 14:01..
|
|
|

28.11.2007, 13:55
|
|
Постоянный
Регистрация: 10.12.2005
Сообщений: 939
Провел на форуме: 3886281
Репутация:
929
|
|
Я так понимаю что это лаботаторная 4 задание 10 ;-)
Судя по всему речь идет о том что слоны могут бить слонов но не тур и наоборот. т.е. твоя картинка пока что верна. НУ ИМХО Конечно!
http://forum.ixbt.com/topic.cgi?id=26:37553 - BlackLor (Pell)
НЕ верно сказал! Так не делай.
Твой ответ будет 8 слонов в первой строке и еше нсколько внизу!!! А у тебя надо посчитать максималку того и того... Надо мудрить с квадратами 3*3 кароче в асю )
Последний раз редактировалось spider-intruder; 28.11.2007 в 14:28..
|
|
|

28.11.2007, 14:05
|
|
Постоянный
Регистрация: 10.12.2005
Сообщений: 939
Провел на форуме: 3886281
Репутация:
929
|
|
2Zaco
Я свой универ уже благо закончил N лет назад и уже 2 работы поменял :-)
Мне просто интересна задача
>> "сложность правда будет не просто оценить, потому что сразу сказать сколько вариантов лишних отметает одна фигура не ясно"
В том то и дело 
|
|
|
|
 |
|
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|