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

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

Вернуться   Форум программистов > Клуб программистов > Свободное общение
Регистрация

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 20.10.2010, 11:16   #1
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию Задание, не попавшее на олимпиаду ;)

Вчера просматривал темы, и в одной из них автор просил помочь с вращением матрицы. Нужно было определенный элемент сдвинуть в угол, а все остальные должны были вращаться.
Вспомнилась задача которая чуть было не попала в 95 году на олимпиаду, но по какой то причине была исключена из списка.

За точность текста не ручаюсь но смысл был таким:
Цитата:
Есть массив А(10) = (1,2,3,4,5,6,7,8,9,10)
Необходимо одним циклом переписать его в массив B(10) со сдвигом начиная от некоего элемента т.е.
А(10) = (1,2,3,4,5,6,7,8,9,10) - сдвиг 3-го элемента в край с вращением
В(10) = (3,4,5,6,7,8,9,10,1,2)
Или в другую сторону
В(10) = (4,5,6,7,8,9,10,1,2,3)
Чтоб ключевой элемент стал в конец или начало массива. Не суть важно.
Но сама цепочка элементов не терялась

Запрещается:
Использовать условия (if while и т.д.), использовать более одного цикла для помещения элементов в выходной массив, выходить за пределы массивов.

Я так смутно помню что там был запрет на динамическое изменение значения счетчика цикла, но по-моему без ветвлений это сделать в принципе не возможно. В общем счетчик цикла должен по ходу решения только увеличиваться.

Т.е необходимо разработать функцию y=f(x) где x - сам счетчик, а у - вычисленный индекс очередного по циклу элемента массива А.
Вот примерно такую задачу нам по секрету рассказал один из преподавателей, и добавил "Ставлю 5 тому кто решит эту задачу самым коротким кодом"

А ну ка мастера логики и математики - а как бы вы решили эту задачу

Я нашел решение как вращать массив при таких условиях массив, вот интересно узнать как остальные решат, может кто и выдаст гениальную идею
I'm learning to live...

Последний раз редактировалось Stilet; 20.10.2010 в 11:22.
Stilet вне форума Ответить с цитированием
Старый 20.10.2010, 12:17   #2
ADSoft
Старожил
 
Регистрация: 25.02.2007
Сообщений: 4,178
По умолчанию

ну вроде так, функция будет y=(i+start) mod 10
... а программа -
Код:
Program p1;
 uses crt;
 const A  : Array[0..9] of integer = (1,2,3,4,5,6,7,8,9,10);
 var   B  : Array[0..9] of integer;
       i, start,k,m : integer;
begin
 start:= 3;
 clrscr;
 for i:=0 to 9 do
     begin
          k:=(i+start) mod 10;
          B[i]:=A[k];
          writeln(B[i]);
     end;
end.
ADSoft вне форума Ответить с цитированием
Старый 20.10.2010, 12:21   #3
mrChester
Я
Форумчанин
 
Аватар для mrChester
 
Регистрация: 24.04.2010
Сообщений: 693
По умолчанию

Цитата:
Запрещается:
Использовать условия (if while и т.д.)
Не совсем понятно...
Все персонажи вымышлены, все совпадения случайны.
Если жизнь игра, тогда я её разработчик ©.
mrChester вне форума Ответить с цитированием
Старый 20.10.2010, 12:39   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Не совсем понятно...
Что именно?
Цитата:
ADSoft
Ты практически мои мысли угадал, единственное что я у себя добавил так k:=abs((i+start) mod 10); чтоб от -бесконечности до +бесконечности счетчик цикла мог меняться
I'm learning to live...

Последний раз редактировалось Stilet; 20.10.2010 в 12:48.
Stilet вне форума Ответить с цитированием
Старый 20.10.2010, 12:49   #5
dr.Chas
***
Участник клуба
 
Аватар для dr.Chas
 
Регистрация: 30.07.2007
Сообщений: 1,162
По умолчанию

А(10) = (1,2,3,4,5,6,7,8,9,10)

массив обязательно такой? или можут быть любые цифры?
dr.Chas вне форума Ответить с цитированием
Старый 20.10.2010, 12:58   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
или можут быть любые цифры?
В оригинальном задании вообще не указан тип элементов массива. И размер массива кстати тоже. Я для примера привел 10-ти элементный массив.

В принципе ADSoft решение хорошее представил. Я так тоже думал, но чет дет протупил, и пошел другим более сложным путем, хотя тоже уложилось в одну формулу, но сложнее.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 20.10.2010, 13:07   #7
mrChester
Я
Форумчанин
 
Аватар для mrChester
 
Регистрация: 24.04.2010
Сообщений: 693
По умолчанию

Код:
include <iostream.h>
void main()
{int A[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int B[10];
int k; 
cout <<"Vvesti smeschenie: "; cin >>k;
for (int i=0; i<10; i++){
   B[i] = A[(i+k)%10];
   cout<<B[i]<<' ';
}
}
То же самое, что и у ADSoft, зато кода меньше
Все персонажи вымышлены, все совпадения случайны.
Если жизнь игра, тогда я её разработчик ©.

Последний раз редактировалось mrChester; 20.10.2010 в 13:15.
mrChester вне форума Ответить с цитированием
Старый 20.10.2010, 13:08   #8
ADSoft
Старожил
 
Регистрация: 25.02.2007
Сообщений: 4,178
По умолчанию

abs - низя, в условиях же сказано не выходить за пределы массива
ADSoft вне форума Ответить с цитированием
Старый 20.10.2010, 13:10   #9
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

А разрешено вводить дополнительную переменную указывающую начало массива ? Зачем двигать элементы, когда можно сдвинуть указатель на начальный элемент, а для доступа пересчитывать в действительный индекс массива...
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 20.10.2010, 13:11   #10
ADSoft
Старожил
 
Регистрация: 25.02.2007
Сообщений: 4,178
По умолчанию

2 mrChester - ну.... кода не меньше, на другом языке проста... незнай чет меня прибило что именно на паскале нада...)))) на пхп б ваще еще сократил )))
2 Utkin - start - это смещение которое задается пользователем... никаких доп переменных нет... если тока для удобочитаемости
ADSoft вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Задание на С++ Sergius X Помощь студентам 1 24.10.2009 23:23
Задание / Си Drozvd Помощь студентам 6 11.08.2009 06:33
Задание $ user570 Фриланс 3 15.06.2008 22:11