IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

> Массив зиг-загом, Надо пройти массив змейкой.
DarkWishmaster
сообщение 30.01.2011 21:16
Сообщение #1


Бывалый
***

Группа: Пользователи
Сообщений: 168
Пол: Мужской

Репутация: -  3  +


Привет.
Я пробовал вот таким алгоритмом, но он не пашет.
Надо пройти массив зиг-загом и вывести каждое число на экран.
Например:
INput: 4
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
Output: 13 14 9 5 10 15 16 11 6 1 2 7 12 8 3 4
 
║ i:=n; j:=1;
║ y:=1; x:=-1;
║ write(a[i,j],' ');
║ while (i<>1) and (j<>1) do begin
║ x:=x+2;
║ j:=j+1; write(a[i,j],' ');
║ while (i<>i-x) and (j<>j-x) do begin
║ inc(k);
║ i:=i-k; j:=j-k;
║ write(a[i,j],' ');
║ end;
║ i:=i-1; write(a[i,j],' ');
║ k:=0;
║ inc(y);
║ while (i<>i+y) and (j<>j+y) do begin
║ inc(k);
║ i:=i+k; j:=j+k;
║ write(a[i,j],' ');
║ end;

Изображение вот так.


Сообщение отредактировано: DarkWishmaster - 30.01.2011 21:23
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
Krjuger
сообщение 30.01.2011 23:09
Сообщение #2


Профи
****

Группа: Пользователи
Сообщений: 652
Пол: Мужской
Реальное имя: Алексей

Репутация: -  20  +


Ну для начала,непонятно какое первоначальное значение принимает ваше k... первое упоминание о нем, в том что вы выложили, лиш когда вы его повышаете (inc(k)).Во вторых,у вас 3 бегина и 2 энда...непонятно как организованы циклы.А в третьих,как я понял у вас идет 2 вложеных цикла и сложность алгоритма n в кубе,что не очень хорошо для больших матриц.

Я могу предложить вам такую идею,можете ее рассмотреть.

У нас есть 4 возможных направления движения.Вправо,вверх,влево-вверх,вправо-вниз.Что если организовать 1 цикл и в нем проверять,куда можно пойти с условием приоритетов ходов.Например.
Мы стартуем с точки (n;1)сначала мы проверяем можем ли мы сделать шаг влево-вверх,нет не можем,выходим за граници,тогда проверяем можем ли мы сделать шам вправо,да можем идем туда,теперь мы в (n;2),проверяем можем ли мы вверх-влево,да можем идем туда.Тперь мы в (n-1;1),проверяем вверх влево,нет не можем.смотрим вправо,да можем.тогда проверяем,какой был предыдущий шаг,он был вверх-влево,тогда проверяем можем ли мы вверх,,если да то идем вверх.если нет то идем вправо.Да мы можем, идем в верх.

Ну и так далее.В общем мы создаем приоритеты по направлению движения и ставим условия так,чтобы у нас нельзя сделать шаг после вверх-влево сразу вправо,если у нас есть возможность сдвинуться вверх.ну и другие подобные ходы.Сложность этого алгоритма N,что достаточно выгодно для больших матриц,правда с условиями надо достаточно сильно проработать.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Сообщений в этой теме


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 20.07.2025 14:37
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"