Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.11.2015, 19:36   #1
dimon_snake
Форумчанин
 
Регистрация: 05.11.2015
Сообщений: 167
По умолчанию Задача про дракона и рыцаря

Задача
Есть дракон. Есть рыцарь. Если отрубить дракону 1 голову, вырастет новая. Если отрубить 1 хвост, вырастет два хвоста. Если отрубить два хвоста, вырастет голова. А если отрубить две головы - ничего не вырастет. Нельзя сразу отрубать хвост и голову. Максимум - два хвоста\головы. Вовходном файле 2 цифры, кол-во голов и хвостов. Вывести, за сколько ударов рыцарь победит дракона, а если не победит, вывести -1.
Суть в чем: Если у дракона 0 хвостов, и непарное кол-во голов, его не победить. Иначе же:Если кол-во хвостов парное, тогда кол-во хвостов деленное на два, это будет кол-во полученных с них голов. А если это число парное, то дракона легко победить, отрезая по две головы. Если (h+(t div 2)) mod 2=0, тогда режем по два хвоста, пока не закончатся, потом по две глловы, добавляя при этом к x один.
Код:
var
t,h,x:integer;\\x - кол-во ударов, t(tail)- хвост, h - head(голова)
fi,fo:text;
begin
Assign(fi,'dragon.in');
Assign(fo,'dragon.out');
Reset(fi);
Rewrite(fo);
Read(fi,h,t);
if ((t mod 2<>0) and (h mod 2<>0))or((t mod 2<>0) and(h mod 2<>0))or((t mod 2=0)and(h mod 2<>0))or((t mod 2<>0)and(h mod 2=0))  then begin
while t<10000000000000 do begin
if t mod 2 = 0 then
if (h+(t div 2))mod 2 = 0 then break;
Inc(t);\\Отрезаем один хвоста, получаем два)
Inc(x);\\+ 1 удар
end;
while t>0 do begin
t:=t-2;
Inc(h);
Inc(x);
end;
While h>0 do begin 
h:=h-2;
Inc(x);
end;
end
else x:=-1;
Write(fo,x);
Close(fo);
end.
Проще конечно в условии было сделать наоборот, если хвосты равны нулю, а головы непарны, тогда иксу присваивать -1, но так я на задании писал. Что не так?
Возможно, потому что там не учтено, если головы парны, а хвостов нет?
dimon_snake вне форума Ответить с цитированием
Старый 23.11.2015, 14:28   #2
Dvoishnik
Форумчанин
 
Регистрация: 12.02.2011
Сообщений: 808
По умолчанию

минимальное количество ударов можно рассчитать так.
Код:

smert:=((s mod 2) = 0);
if  smert then 
 kolUd:=(s div 2)
else 
 if i >= 2 then 
	Begin 
	 smert:=true;
	 kolUd:=(s div 2)+2;	
	end 
	else 
         if i > 0 then 
	 Begin 
	  smert:=true;
	  kolUd:=(s div 2)+3;	
	 end;
1 отрубаем головы
2 если остается одна то
3 проверяем есть ли у дракона 2 хвоста
4 если есть отрубаем их
4.1 если нет рубим 1 потом 2
5 отрубаем 2 головы
если у дракона нет голов он мертв или условием победы является отсутствие и хвостов и голов??
Терпение!Дежурный экстрасенс скоро свяжется с вами!

Последний раз редактировалось Dvoishnik; 23.11.2015 в 14:34.
Dvoishnik вне форума Ответить с цитированием
Старый 23.11.2015, 14:43   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
если у дракона нет голов он мертв или условием победы является отсутствие и хвостов и голов??
именно. ведь если останется один хвост, то после его отрубания будет два хвоста, а если отрубить два хвоста, то вырастет голова.
и, бинго - дракон снова с головой!

задачка известная.
почитать можно, например:
http://conf.7ya.ru/fulltext-thread.a...Care7&trd=5891
http://www.problems.ru/view_problem_...w.php?id=88038
http://slidegur.com/doc/1703152/prez...-pro-drakonov-


ну и анекдот в тему..
-----
Илья Муромец рассказывает о битве с Чудом-Юдом.
- Срубаю я ему три головы - семь новых голов вырастает. Исхитряюсь и сношу ему семь новых голов - четыре вырастает!.. Четыре часа рубил!..
- И?..
- Никакой закономерности!


Последний раз редактировалось Serge_Bliznykov; 23.11.2015 в 14:48.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 23.11.2015, 16:05   #4
Dvoishnik
Форумчанин
 
Регистрация: 12.02.2011
Сообщений: 808
По умолчанию

не понял зачем рубить хвосты мертвому дракону, но все же:
Код:
if (tailDr mod 2) = 0 then  // у дракона четное кол-во хвостов
	begin
	headDr:=(headDr + (tailDr div 2)) ;  //если да считаем количество полученных голов после отрубания
     if (headDr mod 2) = 0 then  // после отрубания хвостов получается четное количество голов 
		kolUd:=(headDr div 2)+(tailDr div 2) // если да считаем количество ударов по хвостам и головам
		else 
			kolUd:=(headDr div 2)+(tailDr div 2) +3; // если нет добавляем 3 урара по хвостам (делаем четное кол-во голов)    	 
	end 
	 else 
		begin
		headDr:=(headDr + (tailDr div 2))+1;  //если нет прибавляем одну голову  
		 if (headDr mod 2) = 0 then  // голов четное кол-во 
			kolUd:=(headDr div 2) +2 //если да  добавляем 2 удара по хвостам (делаем их четными и отрубаем, голову уже добавили) 
			else
				kolUd:=(headDr div 2) +5;	// если нет добавляем 5 ударов по хвостам 
		end;
правильно??
Терпение!Дежурный экстрасенс скоро свяжется с вами!
Dvoishnik вне форума Ответить с цитированием
Старый 23.11.2015, 16:13   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

нет, не верно.
для трёхголового и трёххвостного дракона количество ударов должно быть 9
(у Вас почему то 7)

а во вторых, если ввести ноль хвостов и три головы,
ваша программа утверждает, что можно убить дракона за 4 удара.
Это совсем не так. Количество ударов должно быть -1 // минус единица (такой дракон не убиваем).
Serge_Bliznykov вне форума Ответить с цитированием
Старый 23.11.2015, 17:07   #6
Dvoishnik
Форумчанин
 
Регистрация: 12.02.2011
Сообщений: 808
По умолчанию

Каюсь на мудрил, так то уж точно должно быть верно
Код:
if (tailDr <> 0)  or ((HeadDr mod 2) = 0) then 
	begin 
	 While ((tailDr mod 2) <> 0) or (((headDr+(tailDr div 2) )mod 2 ) <> 0) do
		begin
		 inc(tailDr);
		 inc(kolUd);
		end;
	 headDr:=headDr+(tailDr div 2);
	 kolUd:=kolUd+(tailDr div 2)+(headDr div 2);
	end
 else kolUd:=-1;
верно, верно??
Терпение!Дежурный экстрасенс скоро свяжется с вами!
Dvoishnik вне форума Ответить с цитированием
Старый 23.11.2015, 17:25   #7
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от Dvoishnik Посмотреть сообщение
верно, верно??
вот, теперь я ошибок найти не смог.
На мой взгляд это корректный код.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 23.11.2015, 17:27   #8
Dvoishnik
Форумчанин
 
Регистрация: 12.02.2011
Сообщений: 808
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
вот, теперь я ошибок найти не смог.
На мой взгляд это корректный код.
я молодец, пойду съем печеньку с кофе))

П.С. спасибо за проверку))
Терпение!Дежурный экстрасенс скоро свяжется с вами!
Dvoishnik вне форума Ответить с цитированием
Старый 23.11.2015, 17:38   #9
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

тыц
Poma][a вне форума Ответить с цитированием
Старый 23.11.2015, 17:48   #10
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Poma][a, это ДРУГАЯ задача.
Там сила стаи, а тут отрубание голов и хвостов!

Мне кажется, была и тут на форуме когда-то давно тема про отрубание голов/хвостов.
Но я её не нашёл...


Dvoishnik, приятного аппетита!
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Задача - может ли принц мечом срубить все головы дракона SweetyGirl Паскаль, Turbo Pascal, PascalABC.NET 13 10.04.2015 21:16
Pascal работа с циклами (задача про S-ножку и К-главого дракона) anton.dasuik Помощь студентам 2 02.03.2013 23:52
Игра 'Руна дракона 2' nuberod Gamedev - cоздание игр: Unity, OpenGL, DirectX 17 08.01.2013 08:46
руна дракона nuberod Gamedev - cоздание игр: Unity, OpenGL, DirectX 9 12.10.2012 11:28