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 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
volvo
сообщение 1.11.2004 12:59
Сообщение #2


Гость






Смотри, что я наваял: blink.gif

Код

program spirall;
uses crt;
const Size=7;
k=0;
var mas:array[1..size,1..size]of shortint;
i,j,a:integer;

type
 direction = (go_right, go_down, go_left, go_up);

var current: direction;

function check_direction(i, j: integer): boolean;

 function next_direction(x: direction): direction;
   begin
     if x <> go_up then
       next_direction := succ(x)
     else
       next_direction := go_right
   end;

 var change: boolean;
 begin
   check_direction := true;

   change := false;
   case current of
     go_right:
       if (j = size) then
         change := true
       else
         if mas[i, j+1] <> k then
           change := true
         else exit;
     go_down:
       if (i = size) then
         change := true
       else
         if mas[i+1, j] <> k then
           change := true
         else exit;
     go_left:
       if (j = 1) then
         change := true
       else
         if mas[i, j-1] <> k then
           change := true
         else exit;
     go_up:
       if (i = 1) then
         change := true
       else
         if mas[i-1, j] <> k then
           change := true
         else exit;
   end;

   if change then
     current := next_direction(current);
   check_direction := false
 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;


for a := 1 to pred(sqr(size)) do
 begin
   while not check_direction(i, j) do;
   case current of
     go_right: inc(j);
     go_down : inc(i);
     go_left : dec(j);
     go_up   : dec(i);
   end;
   mas[i, j] := succ(a)
 end;

draw;
end.


Добавлено:

Оптимизированный код... :D
Код

Uses Crt;

Const
 size = 7;
 k = 0;

Var
 mas: Array[1 .. size, 1 .. size] Of ShortInt;

Type
 direction = (go_right, go_down, go_left, go_up);

Var
 current: direction;

{$F+}
Function getPred(x: Integer): Integer;
 Begin getPred := Pred(x) end;
Function getSucc(x: Integer): Integer;
 Begin getSucc := Succ(x) end;
{$F-}

Function check_direction(i, j: Integer): Boolean;

 Function next_direction(x: direction): direction;
   Begin
     If x <> go_up Then
       next_direction := Succ(x)
     Else
       next_direction := go_right
   End;

 Type
   TAxis = (isVert, isHoriz);
   TFunc = Function(x: Integer): Integer;

 Function check_range(is: TAxis; range: Integer;
          f: TFunc): Boolean;
   Begin
     check_range := True;
     Case is Of
       isVert:
         If (i = range) Then
           check_range := False
         Else
           If mas[f(i), j] <> k Then
             check_range := False;
       isHoriz:
         If (j = range) Then
           check_range := False
         Else
           If mas[i, f(j)] <> k Then
             check_range := False
     End
   End;

 Begin
   check_direction := True;

   Case current Of
     go_right:
       If check_range(isHoriz, size, getSucc) Then exit;
     go_down:
       If check_range(isVert, size, getSucc) Then exit;
     go_left:
       If check_range(isHoriz, 1, getPred) Then exit;
     go_up:
       If check_range(isVert, 1, getPred) Then exit;
   end;

   current := next_direction(current);
   check_direction := False
 End;


Procedure draw;
 Var
   i, j: Integer;
 Begin
   WriteLn;
   For i := 1 To size Do
     Begin
       For j := 1 To size Do
         Write(mas[i,j]:2,'|');
       WriteLn
     End
 End;

Var
 i, j, a: Integer;

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;

 For a := 1 To Pred(Sqr(size)) Do
   Begin
     While not check_direction(i, j) Do;
     Case current Of
       go_right: Inc(j);
       go_down : Inc(i);
       go_left : Dec(j);
       go_up   : Dec(i)
     End;
     mas[i, j] := Succ(a)
   End;

 draw
End.


Сообщение отредактировано: volvo - 1.11.2004 23:17
 К началу страницы 
+ Ответить 

Сообщений в этой теме
Флогримм   Алгоритмы на матрицах   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


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

 



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