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

> Правила раздела!

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

> Алгоритмы на матрицах, какие есть приемы?
Флогримм
сообщение 28.10.2004 7:39
Сообщение #1


Бывалый
***

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

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


вчера сел решать задачи на тему двумерных массивов - матриц и столкнулся с проблемой; какие можете посоветовать приемы программиования для алгоритмов, вида "заполнить матрицу по спирали, зигзагом" и т.д.

мне не конкретной задачи нужно решение, а метод в целом

пришла в голову такая идея: написать процедуры движения по матрице в четырех направленияъ (вверх, вниз, влево, вправо) до тех пор, пока не встретим либо конец матрицы ("крайнюю стенку") или же уже заплненный алгоритм и циклически повторять их до тех пор пока не заполним всю матрицу... да, наверное так и попробую

хотя мне кажется, что выход, который предложил выше не совсем правильный; может все можно свести все к основной (единственной формуле) формуле где меняться будет только значение i,j-счетчиков в цикле?

вобщем матрицы для меня проблема; помогите чем могите; в книгах же только и делают, что задачки пишут, а концепцию разъясникть - :no:

вот так
а еще вопрос: 1)как в вин2к в ТП7 установить русскую раскладку клавы; 2)как прервать зациклившийся процесс? (Ctrl-Break и Ctrl-F2 не работают)

зосим откланиваюсь, с уважением, Флогримм


--------------------
Я не буду жить с этой злобой внутри / Я не буду частью смертельной цепи / Я не буду потребителем твоих идей / Я не буду никогда убивать зверей (Unconform)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
Флогримм
сообщение 2.11.2004 20:56
Сообщение #2


Бывалый
***

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

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


Бродяжник!
Ваше сообщение - это то, чего я так долго ждал в этой теме! спасибо огромное!
я с вашей помощи наконец решил эту задачу. Ниже приведен код.

Код

program spirall;
uses crt;
const Size=7;
k=-1; {"пустая ячейка" содержит значение k}
var mas:array[1..size,1..size]of shortint;
i,j,a:integer;

function freemas(i,j: shortint): boolean; {(с) Бродяжник - функция проверяет,}
begin                                     {является ли ячейка с координатами i,j "пустой ячейкой"}
if (i<1) or (i>size) or (j<1) or (j>size)
then freemas:=false
else freemas:=(mas[i,j]=k);
end;

procedure draw; {печать массива}
begin
writeln;
for i:=1 to size do begin
   for j:=1 to size do write(mas[i,j]:2,'|');
   writeln;
   end;
end;

begin
for i:=1 to size do
   for j:=1 to size do mas[i,j]:=k; {заполнение массива "пустыми ячейками"}

clrscr;
i:=1;
j:=1;
mas[i,j]:=1;

{algorithm}
for a:=1 to sqr(size)-1 do
begin
  if (freemas(i-1,j)) and (not freemas(i,j-1)) then begin dec(i); mas[i,j]:=a+1; end else
  if freemas(i,j+1) then begin inc(j); mas[i,j]:=a+1; end else
  if freemas(i+1,j) then begin inc(i); mas[i,j]:=a+1; end else
  if freemas(i,j-1) then begin dec(j); mas[i,j]:=a+1; end else
  continue;
end;
{/algorithm}

draw;
end.

Пришлось чуть-чуть исправить алгоритм, т.е. я установил более высокий приоритет на движение вверх и немного изменил условия этого движ-я (идти вверх, только если верхняя ячейка пуста, а правая заполнена). Можете проверить прога работает.

Я считаю, что это один из наиболее универсальных алгоритмов, потому что:
1) количество действий минимальное, для матрицы порядка n оно равно n*n
2) изменяя очередность проверки(приоритет направления) и условия перехода на новую ячейку можно задавать многие виды движений! Например, поменял местами только строки и движ-е уже абсолютно иное, чсмотрите

Код
if (freemas(i-1,j)) and (not freemas(i,j-1)) then begin dec(i); mas[i,j]:=a+1; end else
  if freemas(i+1,j) then begin inc(i); mas[i,j]:=a+1; end else
  if freemas(i,j+1) then begin inc(j); mas[i,j]:=a+1; end else
  if freemas(i,j-1) then begin dec(j); mas[i,j]:=a+1; end else continue;


в данном случае движ-е следующее:
Код
01|08|09|16
02|07|10|15
03|06|11|14
04|05|12|13

Не в обиду Вольво будет сказано, но по-моему мой алгоритм более лаконичен и понятен, чем его продвинутые вышеприведенные алгоритмы.

2 Олег_З
если хочешь, можешь включить этот алгоритм в ФАК по матрицам.

только я до сих пор не пойму, почему компиллятор ведет себя именно так, как описал Бродяжник (я понял как ведет, только не понял почему, не логичное поведение какое-то)


--------------------
Я не буду жить с этой злобой внутри / Я не буду частью смертельной цепи / Я не буду потребителем твоих идей / Я не буду никогда убивать зверей (Unconform)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Сообщений в этой теме
Флогримм   Алгоритмы на матрицах   28.10.2004 7:39
Altair   Это тема неоднократно обсуждалась! Методтаков...   28.10.2004 8:12
Флогримм   вот еще несколько вопросов, пожалуй, размещу здесь...   28.10.2004 9:02
volvo   В меню Run -> Parameters вводишь параметры дл...   28.10.2004 9:16
Altair   Да это неважно, все равно вставляй эту сроку. Э...   28.10.2004 9:32
Флогримм   volvo, спасибо. Усвоил. Ща попробую. ясно поч...   28.10.2004 10:19
Altair   Зависит от задачи. и от способа реализации...   28.10.2004 10:26
Флогримм   вот как на мой взгляд лучше всего решать задачу на...   1.11.2004 11:41
volvo   Смотри, что я наваял: :blink: program spirall;...   1.11.2004 12:59
Флогримм   Вольво, спасибо, ща попробую разобраться. А с моим...   1.11.2004 13:24
volvo   Флогримм У твоего алгоритма есть очень существен...   1.11.2004 13:39
Флогримм   volvo а зачем проверять? вот смотри: доходим до п...   1.11.2004 15:00
volvo   А попробуй откомпилировать и запустить свою прогр...   1.11.2004 15:13
Amro   Можно здеся посмотреть http://forum.pascalnet.ru...   1.11.2004 17:05
Altair   Согласен. Можно. Так кто тебе мешает это сделать? ...   1.11.2004 17:19
Флогримм   201 Range check error (Ошибка при проверке гр...   2.11.2004 0:15
volvo   но при прогоне программы мы туда-таки попадаем ...   2.11.2004 1:13
Флогримм   я понимаю!! прога работает НЕПАРВИЛЬНО...   2.11.2004 7:11
Бродяжник   Флогримм Вы слишком широко понимаете смысл слов ...   2.11.2004 10:51
Флогримм   Бродяжник! Ваше сообщение - это то, чего я так...   2.11.2004 20:56
Puzik89   ДОБРЫЙ ДЕНЬ! Может ли кто - то мне подсказать ...   12.06.2007 17:02
volvo   Это не спираль, а "змейка" - в поиске на...   12.06.2007 17:06


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

 



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