Vladimir_S |
13.06.2010 20:27 |
MrSTEP, я смиренно прошу извинения, что встреваю, но просто меня задачка заинтересовала. А задачка-то ох, не простая! Сам провозился больше часа.
Как я понимаю, речь идет вот о чем. Пусть есть прямоугольная матрица. Нужно сдвинуть нумерацию элементов либо "вправо", т.е. каждый элемент строки занимает место сдвинутого в строке на n позиций с переходом на следующую строку, последних элементов - на начало матрицы, ну или "вниз" - это когда тоже самое, но по столбцам.
Вот что у меня получилось:
Код:
Const
M0=4;
N0=5;
VAR
A1,A2:ARRAY[1..M0,1..N0] of BYTE;
B1,B2:ARRAY[1..M0*N0] of BYTE;
n:WORD;
i,j,k:Integer;
C:Char;
BEGIN
RANDOMIZE;
For i:=1 to M0 do
For j:=1 to N0 do
A1[i,j]:=Random(100);
Writeln('Initial matrix:');
For i:=1 to M0 do
begin
For j:=1 to N0 do
Write(A1[i,j]:4);
WriteLn;
end;
WriteLn;
WriteLn('Enter the regime - Right (R) or Down (D):');
ReadLn(C);
Write('Enter the Shift ');
ReadLn(n);
If (C='R') or (C='r') then
begin
For i:=1 to M0 do
For j:=1 to N0 do
B1[(i-1)*N0+j]:=A1[i,j];
end else
begin
For j:=1 to N0 do
For i:=1 to M0 do
B1[(j-1)*M0+i]:=A1[i,j];
end;
For i:=1 to M0*N0 do
begin
If (i+n)<=M0*N0 then k:=(i+n) else
If ((i+n) mod (M0*N0))=0 then k:=M0*N0 else
k:=((i+n) mod (M0*N0));
B2[k]:=B1[i];
end;
If (C='R') or (C='r') then
begin
For i:=1 to M0 do
For j:=1 to N0 do
A2[i,j]:=B2[(i-1)*N0+j];
end else
begin
For j:=1 to N0 do
For i:=1 to M0 do
A2[i,j]:=B2[(j-1)*M0+i];
end;
WriteLn;
WriteLn('"Shifted" matrix:');
For i:=1 to M0 do
begin
For j:=1 to N0 do
Write(A2[i,j]:4);
WriteLn;
end;
ReadLn;
END.
Конечно, можно обойтись и без вспомогательных линейных массивов, но тогда там точно запутаешься. Впрочем, может кто-нибудь и поизящнее решение найдет.
|