![]() |
1. Заголовок или название темы должно быть информативным !
2. Все тексты фрагментов программ должны помещаться в теги [code] ... [/code] или [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ" и используйте ПОИСК !
4. НЕ используйте форум для личного общения!
5. Самое главное - это раздел теоретический, т.е. никаких задач и программ (за исключением небольших фрагментов) - для этого есть отдельный раздел!
![]() |
Флогримм |
![]() ![]()
Сообщение
#1
|
![]() Бывалый ![]() ![]() ![]() Группа: Пользователи Сообщений: 253 Пол: Мужской Репутация: ![]() ![]() ![]() |
вчера сел решать задачи на тему двумерных массивов - матриц и столкнулся с проблемой; какие можете посоветовать приемы программиования для алгоритмов, вида "заполнить матрицу по спирали, зигзагом" и т.д.
мне не конкретной задачи нужно решение, а метод в целом пришла в голову такая идея: написать процедуры движения по матрице в четырех направленияъ (вверх, вниз, влево, вправо) до тех пор, пока не встретим либо конец матрицы ("крайнюю стенку") или же уже заплненный алгоритм и циклически повторять их до тех пор пока не заполним всю матрицу... да, наверное так и попробую хотя мне кажется, что выход, который предложил выше не совсем правильный; может все можно свести все к основной (единственной формуле) формуле где меняться будет только значение i,j-счетчиков в цикле? вобщем матрицы для меня проблема; помогите чем могите; в книгах же только и делают, что задачки пишут, а концепцию разъясникть - :no: вот так а еще вопрос: 1)как в вин2к в ТП7 установить русскую раскладку клавы; 2)как прервать зациклившийся процесс? (Ctrl-Break и Ctrl-F2 не работают) зосим откланиваюсь, с уважением, Флогримм -------------------- Я не буду жить с этой злобой внутри / Я не буду частью смертельной цепи / Я не буду потребителем твоих идей / Я не буду никогда убивать зверей (Unconform)
|
![]() ![]() |
volvo |
![]()
Сообщение
#2
|
Гость ![]() |
Смотри, что я наваял:
![]() Код 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 |
![]() ![]() |
![]() |
Текстовая версия | 25.07.2025 22:24 |