Циклический сдвиг элементов матрицы..
Как осуществлить циклический сдвиг элеменитов прямоугольной матрицы на n элементов вправо или вниз, n может быть больше количества элементов в строке или столбце?
Руками:
Влево:
n:=n mod nx;
for i:=1 to ny do//ny- число строк
for k:=1 to n do//n- на сколько сдвигать
begin
h:=a[i,1];
for j:=1 to nx-1 do//nx- число столбцов
a[i,j-1]:=a[i,j]
a[i,nx]:=h
end;
Вправо сам переделаешь?
Руками:
Влево:
n:=n mod nx;
for i:=1 to ny do//ny- число строк
for k:=1 to n do//n- на сколько сдвигать
begin
h:=a[i,1];
for j:=1 to nx-1 do//nx- число столбцов
a[i,j-1]:=a[i,j]
a[i,nx]:=h
end;
Вправо сам переделаешь?
неа, и вниз не знаю как
неа, и вниз не знаю как
Вправо:
n:=n mod nx;
for i:=1 to ny do//ny- число строк
for k:=1 to n do//n- на сколько сдвигать
begin
h:=a[i,1];
for j:=nx-1 to downto do//nx- число столбцов
a[i,j+1]:=a[i,j]
a[i,nx]:=h
end;
Как осуществлить циклический сдвиг элеменитов прямоугольной матрицы на n элементов вправо или вниз, n может быть больше количества элементов в строке или столбце?
А самому такое написать слабо? Ведь элементарно же.
А самому такое написать слабо? Ведь элементарно же.
Если элементарно, тогда почему оба решения неправильны и почему ты это не замечаешь?
Пусть nx == 3; n == 3, т.е сдвиг на целую строку влево.
n:=n mod nx; // получаем n==0
for k:=1 to n do // что дальше не выполнется и все
// остается на месте.
h = a[1,1];
for i := 1 to ny do
for j := 1 to nx-1 do
a[i,j] := a[i,j+1];
if(i<ny)
a[i,nx] := a[i+1,1]
else
a[i,nx] := h;
end; // это сдвиг влево
for k := 1 to n do begin
h = a[nx,ny];
for i := ny downto 1 do
for j := nx downto 2 do
a[i,j] := a[i, j-1];
if(i>1)
a[i,1] := a[i-1, nx]
else
a[i,1] := h;
end; // сдвиг вправо
Если элементарно, тогда почему оба решения неправильны и почему ты это не замечаешь?[/code]
А потому что я даже в код не всматривался. Если человек не способен сам решить подобную ерундовую задачу, то ему программированием заниматься противопоказано и помогать таким людям - пустая трата времени.
Ты еще не устал решать задачки за студентов-двоечников?
Ведь это действительно простая задача.
А потому что я даже в код не всматривался. Если человек не способен сам решить подобную ерундовую задачу, то ему программированием заниматься противопоказано и помогать таким людям - пустая трата времени.
ерундовая задача? Откуда знаешь? Ты же в ней не разобрался.
Если задача интересна, и есть пару минут, то могу его решить. Но эта задача и неинтересна и времени нет. Поэтому я только исправил предыдущий код.
Есть матрица nx*ny. Код выше, производит nx*ny*n сдвигов. Можно решить и с помощью nx*ny сдвигов и без отдельных ветвей для правого и левого сдвига. Ты смог бы закодировать такой ерундовый алгоритм?
ерундовая задача? Откуда знаешь? Ты же в ней не разобрался.
Я такие задачи решал через месяц после того, как купил себе комп. Можешь конечно не верить, мне от этого ни холодно ни жарко.
Если задача интересна, и есть пару минут, то могу его решить. Но эта задача и неинтересна и времени нет. Поэтому я только исправил предыдущий код.
Ответь на один вопрос: ЗАЧЕМ???
Ну, раз ты решил бодаться :D и у меня закончился рабочий день(вечер???), то вот:
Есть матрица nx*ny. Код выше, производит nx*ny*n сдвигов. Можно решить и с помощью nx*ny сдвигов и без отдельных ветвей для правого и левого сдвига. Ты смог бы закодировать такой ерундовый алгоритм?
Есть другая мысля: поделить кол-во сдвигов на размерность матрици и сдвинуть ее на остаток от деления.
Если не нравится, то объясни зачем усложнять?
Я такие задачи решал через месяц после того, как купил себе комп. Можешь конечно не верить, мне от этого ни холодно ни жарко.
Конечно, что верю. Я только сказал, что ты не разобрался в задаче, а не то что программировать не умеешь.
потому-что мне интересно.
Так алгоритм выше сдвигает на остаток от деления. Там не хватает 2 команды спереди.
n := n mod (nx*ny);
if n = 0 then exit;
И зачем писать оптимальные алгоритмы?
Допустим есть матрица 1024*1024, более миллиона элементов. Нужно сдвинуть влево на 300 элементов.
Алгоритм выше требует 300 миллион сдвигов, оптимальный 1 миллион сдвигов. Есть разница?
Pentiun IV 3.4G работает в 300 раз быстрее от напр. Pentium II 266M?
Я только сказал, что ты не разобрался в задаче,
А я сказал, что я именно такие задачи (со сдвигами матриц) решал, т.е. я в ней разобрался как только прочитал условие.
Далее:
потому-что мне [color=blue]интересно[/color].
И
Но эта задача и [color=blue]неинтересна [/color]
Как понять??? Ты уж определись, что тебе интересно: поспорить со мной, или решить задачу :)
И зачем писать оптимальные алгоритмы?
Интересно, а что ты так завелся про оптимальные алгоритмы? У нас тут конкурс на оптимальнейший алгоритм года? Дело начиналось как будто-бы не с этого. И если уж на то пошло, то где он - оптимальный алгоритм? Почему-то ты сам написал не оптимальный.
Можно конечно брать отдельный элемент и сразу выщитывать у него сдвиг по горизонтали и по вертикали, заменять элемент на который он "проецируется", выщитывать его сдвиг и т.д. Только там масса нюансов которые я после 12-тичасовой смены в код воплотить не способен, да и не имею ни малейшего желания - есть более полезные задачи. Опять-таки, я не уверен, что он будет оптимальным, поэтому привел вариант который заведемо работает, пусть и не с лучшими характеристиками производительности/экономичности.
Ты уж не поленись, обнародуй нам оптимальный алгоритм собственного разлива.
Однако, как мы далеко углубились во флуд :)
Как-то переживем.
И
Как понять??? Ты уж определись, что тебе интересно: поспорить со мной, или решить задачу :)
Повторю еще раз. Могу решить задачу не вместо кого-то, а для себя если она интересна. В этой задаче ничего интересного нет, по-этому мне было жалко 15-30 минут на более сложный алгоритм решения.
Так я же не писал свой код, только исправил, то что было. И здесь идет речь в первую очередь не об оптимальном алгоритме. А о том, что ты чела обозвал студентом-двоечником, и не исключено, что нормального алгоритма для решения этой задачи сам написать не сможешь. :)
Ну так в чем проблема? Не имеешь 15 минут, чтоб закодировать?
Ага. Сперва была элементарная задача, потом стала просой задачей. А теперь не берешься за него, так как есть шанс что не получится.
Я не хочу тебя позорить. Так как задача действительно проста. Может все ж таки сам напишешь?
Повторю еще раз. Могу решить задачу не вместо кого-то, а для себя если она интересна. В этой задаче ничего интересного нет, по-этому мне было жалко 5 минут на более сложный алгоритм решения.
А как же "мне интересно"? Ладно, проехали, видимо ты на это так и не ответишь.
и не исключено, что нормального алгоритма для решения этой задачи сам написать не сможешь.
На понт берешь? Ну-ну...
Не имеешь 5 минут, чтоб закодировать?
А ты когда-нибудь работал в служебе поддержки пользователей что бы так говорить? К тому же на работе компилера пока (:)) нет.
Ага. Сперва была элементарная задача,
Ага, такая и есть.
Я не хочу тебя позорить.
Ай! ОЙ! Плакать буду! Не обижайте меня! Вообще - подобные фразы это отмазка номер 1 в мире.
Не я первый начал говорить про оптимальный алгоритм. И не я его предлагал. Где же он?
Ладно, раз на то пошло, то можно и не поспать еще немного. Вот от меня на вскидку:
{
int x_sz,y_sz;//razmernost' massiva
int x_shft,y_shft;//gorizontal'niy i vertical'niy sdvigi
register unsigned int x,y,num;//peremennie dlya ciclov
int new_x,new_y;
cout<<"Vvedite razmer po gorizontali: ";
cin>>x_sz;
cout<<"Vvedite razmer po verticali: ";
cin>>y_sz;
//sozdaem i inicializiruem dinamicheskiy massiv
int **matrix= new int * [x_sz];
for(x=0;x<x_sz;x++)matrix[x]=new int[x_sz];
//inicializaciya massiva
for(num=0,x=0;x<x_sz;x++)
for(y=0;y<y_sz;y++,num++)matrix[x][y]=num;
for(y=0;y<y_sz;y++)
{
cout<<endl;
for(x=0;x<x_sz;x++)cout<<matrix[x][y]<<" ";
}
//sozdaem sdvinutuyu copiyu
int **matrix2= new int * [x_sz];
for(x=0;x<x_sz;x++)matrix2[x]=new int[x_sz];
//zadaem sdvigi
cout<<"\nVvedite gorizontal'niy i vertical'niy sdvigi:\n";
cin>>x_shft>>y_shft;
//nachinaem sdvigat'
for(x=0;x<x_sz;x++)
for(y=0;y<y_sz;y++)
{
if((x_shft % x_sz + x) >= x_sz ) new_x= x_shft % x_sz + x - x_sz;
else new_x=x_shft % x_sz + x;
if((y_shft % y_sz + y) >= y_sz ) new_y= y_shft % y_sz + y - y_sz;
else new_y=y_shft % y_sz + y;
matrix2[new_x][new_y]=matrix[x][y];
}
for(y=0;y<y_sz;y++)
{
cout<<endl;
for(x=0;x<x_sz;x++)cout<<matrix2[x][y]<<" ";
}
delete matrix;
return EXIT_SUCCESS;
}
На идеальность и оптимальность он не претендует, но пожалуй "порвет" по скорости тот вариант, что я предложил перед этим. Конечно при достаточном количестве памяти.
Жду твой оптимальный код.
x_sz=y_sz=3
x_shft=y_shft=1
0 1 2
3 4 5
6 7 8
после сдвига
8 6 7
2 0 1
5 3 4
вместо
5 6 7
8 0 1
2 3 4
т.е. алгоритм не правильный. Можно подправить твой вариант.
#include <conio.h>
int main(int argc, char *argv[])
{
int x_sz,y_sz; // razmernost' massiva
int x_shft,y_shft; // gorizontal'niy i vertical'niy sdvigi
int x,y,num; // peremennie dlya ciclov
int new_x,new_y;
cout<<"Vvedite razmer po gorizontali: ";
cin>>x_sz;
cout<<"Vvedite razmer po verticali: ";
cin>>y_sz;
//szozdaem i inicializiruem dinamicheskiy massiv
int a_size = y_sz*x_sz; // razmernoszty
int *matrix = new int[a_size<<1];
int *matrix2 = matrix + a_size;
//inicializaciya massiva
for(num=0;num<a_size;num++)
matrix[num]=num;
for(y=0;y<y_sz;y++)
{
cout<<endl;
for(x=0;x<x_sz;x++)cout<<matrix[y*x_sz+x]<<" ";
}
//zadaem sdvigi
cout<<"\nVvedite gorizontal'niy i vertical'niy sdvigi:\n";
cin>>x_shft>>y_shft;
//nachinaem sdvigat'
int *dst = matrix2+((y_shft*x_sz + x_shft)%a_size);
int *dst_end = matrix2 + a_size;
for(int *src=matrix;src<matrix2;src++)
{
*dst = *src;
dst++;
if(dst>=dst_end)dst = matrix2;
}
for(y=0;y<y_sz;y++)
{
cout<<endl;
for(x=0;x<x_sz;x++)cout<<matrix2[y*x_sz+x]<<" ";
}
cout<<endl;
delete[] matrix;
getch();
return 1;
}
Значит Паскаль. Есть один массив a[ny, nx]. Второй массив не создается. Сдвиг задается одним числом n. Если n > 0, тогда сдвиг вправо, если меньше нуля, тогда сдвиг влево.
Я бы с радостью написал свой код, но я уже привел 2 решения, а ты ни одно.
Какой горизонтальный и вертикальный сдвиг? Сдвиг задается одним числом n.
Моя твоя не понимать. Хочешь сказать, что по диагонали? Или змейкой? То ты вообще хочешь сказать? Ты можешь по человечески объяснить своё задание?
Но пусть будет. Довольно много багов при инициализации.
Каких?
Но пусть и они будут. Но если взять конкретный пример. Матрица 3*3, сдвиг вправо на 1 позицию и вниз тоже на одну позицию, т.е. сдвиг вправо на 4.
Ни хрена (пардон) не понял что ты хочешь. Можешь поконкретнее задание растолковать? Какой сдвиг вправо на 4??? У нас есть сдвиг в право и сдвиг вниз, если ты сам не забыл начальное задание. Я не телепат, что бы читать твои мысли и понять, что ты хочешь.
(Если задать сдвиг влево и вверх, т.е. x_shft, y_shft<0, получим выход за пределы второго массива).
Еще раз: ЧИТАЙ ЗАДАНИЕ!!! Где там про сдвиги влево и вверх??? И потом, тебе что, трудно поменять по условию знак в выражении вычисления сдвига? Или самому ума не хватит?
Имеем в начале
x_sz=y_sz=3
x_shft=y_shft=1
0 1 2
3 4 5
6 7 8
В начале имеем:
0 3 6
1 4 7
2 5 8
Т.е. ты вообще не понял, как работает моя программа, с самых начальных строк, и после этого пытаешься мне говорить про то, что я не понимаю задания.
после сдвига
5 6 7
8 0 1
2 3 4
И каким рожном это получилось из одного сдвига вниз и одного сдвига вправо??? Кто нибудь кроме Mоngооsе это знает? Тут какой-то сдвиг "змейкой". Верно Mоngооsе? Естественно моя прога работает не так, т.к. она сдвигает по заданию а не по мыслям в ТВОЕЙ голове!
За дальнейшее дико извиняюсь, но у меня просто уже не хватает терпения выслушивать клевету в свой адрес
т.е. алгоритм не правильный. Можно подправить твой вариант.
Ты чё тут паришь шут гороховый??? Какой алгоритм не правильный? Чё ты тут всем "подправить" пытаешься??? Ты самостоятельно можешь написать хоть одну строчку кода, а не подправлять остальных??? Это очень похоже на попытки опустить БГ малолетним ламьем ("windows must die") которое само нифига сделать не может, кроме критики других.
Но это не та задача и не тот язык.
А где в задании идет речь о конкретном ЯП??? Укажи пожалуйста номер того слова в первом посте топика, где указано название языка. Иначе - прекрати свой безосновательный базар о том, что можно, а что нельзя и на чем мне писать. В ветку по Паскалю я например даже и не захожу т.к. мне субъективно не нравится этот язык!
Разуй глаза и прочти еще раз:
Как осуществлить циклический сдвиг элеменитов прямоугольной матрицы на n элементов [color=blue]вправо или вниз[/color], n может быть больше количества элементов в строке или столбце?
Я свой вариант решения привел строго по задаче - там есть сдвиг вниз и сдвиг вправо, а то что ты там понаисправлял, даже смотреть не собираюсь.
И о создании дополнительного массива речи не было.
Ага, и об использовании оператора присваивания тоже речи не было. Может ты сам не прав и нужно заюзать CopyMemory??? ;) Каждый программист решает задание по своему. Результат достигнут? Достигнут! Он верен? Верен! Что тебе еще?
Значит Паскаль.
Значит кончай пургу мести! При чем тут Паскаль твой??? Ты вообще кто такой, что бы устанавливать правила на чем писать? Ты заблудился? Ветка называется "Общие вопросы программирования", а не "Программирования на Паскале", т.е. полная свобода выбора языка. Да хоть асм!
Есть один массив a[ny, nx]. Второй массив не создается. Сдвиг задается одним числом n. Если n > 0, тогда сдвиг вправо, если меньше нуля, тогда сдвиг влево.
Ты наконец догнал, что у нас форум по IT, а не по телепатиии! И решил привести свое задание в письменном виде. Я так понял, что это так сказать сдвиг "змейкой"? И что тут такого сложного? Делим количество сдвигов на горизонтальную размерность массива с отбрасыванием остатка от деления, если получаем число большее вертикальной размерности массива, то делим его через MOD на вертикльную разменость и получаем номер строки (нумерация идет с нуля), иначе номер строки у нас и так есть. Далее - делим число сдвигов опять через MOD на горизонтальную размерность - это номер столбца. Берем тот элемент в буфер, присваиваем на его место взятый ранее элемент и повторяем итерацию но уже с новыми, только что вычисленными значениями. Количество итераций равно количеству элементов массива.
Сложно??? По-моему не сложнее обычного циклического сдвига.
Я бы с радостью написал свой код,
Напиши! Порадуй себя и окружающих бездельников. А то ты как Бобер когда то: угрожал всем своим большим проектом.
Не в обиду Бобру, т.к. он исправился и публично извинился и притензий к нему думаю ни у кого нет. Просто пасторальный пример получился :) Бобр - не серчай!
но я уже привел 2 решения, а ты ни одно.
Решения чего??? Здачи которую знал только ты?
И пока ты не объяснишь, чем же не правильно мое решение для поставленной koder'ом задачи, или не возьмешь свои слова назад, дальнейшие дискусии я вести отказываюсь по причине их абсолютной нецелесообразности и твоей не состоятельности как опонента для дискуссии. ;)
Слышал эту поговорку?
Давай для начала разберемся с твоим шедевром.
Размерность массива x_sz, y_sz.
Но ты оба раза создаешь массивы размерности x_sz*x_sz.
Выделяешь память через new[], но удаляешь через delete, вместо delete[]. Это 3 бага.
Потом для
x_sz=y_sz=3
x_shft=y_shft=1
matrix имеет вид
0 1 2
3 4 5
6 7 8
Я понимаю, что тебе кажется, что он имеет вид
0 3 6
1 4 7
2 5 8
Но это только потому, что
Инициализируешь
//inicializaciya massiva
for(num=0,x=0;x<x_sz;x++)
for(y=0;y<y_sz;y++,num++)
matrix[x][y]=num;
т.е. пробегая по строкам
а выводишь
for(y=0;y<y_sz;y++)
{
cout<<endl;
for(x=0;x<x_sz;x++)
cout<<matrix[x][y]<<" ";
}
т.е. пробегая по столбцам.
Это 4й баг.
Вывод результата - тоже столбцы переводятся в строки. 5й баг.
На счет задачи. Кодер говорил об элементах, а не о столбцах или строках.
Напр. матрица a[3,3] сдвиг вправо на 1 позицию.
a[0,0] переходит в a[0,1], итд. но a[0,2] переходит в a[1,0], а не в a[0,0]. Т.е. циклический сдвиг по всему массиву. На форуме паскаль несколько раз спрашивали как отсортировать 2х мерный масив. Не отдельно по строкам или по столбцам, а весь массив.
Но если нужно сдвигать строки или столбцы, а не элементы, тогда задаче еще проще.
Если тебе лучше нравится С, пусть будет C (мне все равно). Значит сможешь реализовать свой алгоритм: "Можно конечно брать отдельный элемент и сразу выщитывать у него сдвиг по горизонтали и по вертикали, заменять элемент на который он "проецируется", выщитывать его сдвиг и т.д." для сдвига столбцов прямугольной матрицы a[y_sz, x_sz] на x_sht позиций вправо и сдвига строк на y_sht позиций вниз? Без костылей, имею в виду без создания доп.массива.
Или же в тех двух кодах цикличесого сдвига элементов матрицы на n позиций вправо найти хотя бы 1 баг?
Я в твоей программе нашел пять багов, но ни с кем тебя не сравнивал и не обзывал.
И если ты макс. что можешь, так это переходить на личности, тогда дискуссию на этом можно закончить.
Размерность массива x_sz, y_sz.
Но ты оба раза создаешь массивы размерности x_sz*x_sz.
Выделяешь память через new[], но удаляешь через delete, вместо delete[]. Это 3 бага.
С этим ты прав - невнимательность и спешка рулит (есть еще одна хорошая пословица, напоминать не буду), но в каком состоянии я был, когда все это писал, я уже намекал. Честно говоря всмотревшись в это всё, с нормально работающей головой, я сам подивился :)
Я получил хороший урок: ни когда не начинай делать даже простейшую задачу если чувствуешь, что не в состоянии сделать ее сейчас.
А тебе ведь надо было меня поддеть? ;)
Если тебе лучше нравится С, пусть будет C (мне все равно). Значит сможешь реализовать свой алгоритм
Смогу. Знаешь, год назад я бы уже сидел и кодировал его. Но к сожалению (или счастью) мне сейчас есть чем заняться более полезным и интересным.
Кстати, я уже предложил именно такой алгоритм, который ты хотел. Ты его решил проигнорировать? Ведь это именно то, о чем ты рассуждал.
Я в твоей программе нашел пять багов, но ни с кем тебя не сравнивал и не обзывал.
Конечно, я поступил не цветочно, но тебе не кажется, что ты на данный момент не лучше меня? И трудно наверное было все баги сразу выложить? Все же тебе нравится людей злить.
Сколько раз уже ты говрил про то, какую ты замечательную программу можешь написать. И где она? Или ты боишься тоже ошибиться? У тебя на нее времени было уже более суток, а я свое "творение" выложил сразу, как только оно пришло мне в голову. Уж сейчас-то наверное у тебя багов в программе точно не будет. Жду.
Конечно, я поступил не цветочно, но тебе не кажется, что ты на данный момент не лучше меня? И трудно наверное было все баги сразу выложить? Все же тебе нравится людей злить.
Мне кажется, ты меня путаешь с 13 летним кул хацкером из Усть-Илимска. Это он любит людей злить.
А ты не заметил, во сколько я написал сегодняшний первый пост? Это я не так рано встал, а просто тогда закончил работу.
Если не сегодня, то завтра к вечеру напишу код.
Мне кажется, ты меня путаешь с 13 летним кул хацкером из Усть-Илимска. Это он любит людей злить.
Усть-Урюпинска кажись :) Да дадно тебе отмазываться, это есть и у тебя и у меня и много у кого еще. Нельзя быть идеальным.
А ты не заметил, во сколько я написал сегодняшний первый пост? Это я не так рано встал, а просто тогда закончил работу.
И? Работа разная бывает.
Если не сегодня, то завтра к вечеру напишу код.
Какой конкретно? Я честно говоря уже запутался :).
Тебе во истину делать видимо по жизни нечего. Счастливый ты человек в отношении свободного времени.
ЗЫ Кто-то говорил про 15-30 минут. Что, у тебя до сих пор не нашлось полчасика? ;) Можешь не отвечать, просто я показал тебе корректность подобных вопросов.
:angel: А я то думал, прочитав топ, что хватит и минуты прочитать.
Слово об оптимизации.
В мат. лабах матрицы хранятся не как 2д массивы. а как линейки строки и работают с ними блочно, а столбцовые сдвиги можно делать умножением(сейчас уже не вспомню как, но было дело...).:}
Бла-бла-бла...
:angel: А я то думал, прочитав топ, что хватит и минуты прочитать.
Неужели все прочитал :D?
Слово об оптимизации.
В мат. лабах матрицы хранятся не как 2д массивы.
Да вообще - массивы любой размерности хранятся в памяти как последовательность байтов а все измерения вычисляются смещением адреса.
Матрица - это чисто логическое представление. Знаете, что из себя представляет планка DDR внутри? И вот попробуйте создать там физически матрицу, а еще лучше - 3-х мерный массив. :)
Неужели все прочитал :D?
Делать больше нечего, я учусь :angel:
Да вообще - массивы любой размерности хранятся в памяти как последовательность байтов а все измерения вычисляются смещением адреса.
Матрица - это чисто логическое представление. Знаете, что из себя представляет планка DDR внутри? И вот попробуйте создать там физически матрицу, а еще лучше - 3-х мерный массив. :)
Просто когда выделяешь динамик. массив, то тут возникают проблемы с мемкопи и т.п.
ShiftItems - сдвигает по элементам,
shiftColRows - по столбцам/строкам.
Из-за того, что могут быть замкнутые пути, пришлесь создать вектор для проверки того, был ли текущий элемент "сдвинут".
#include <conio.h>
#include <stdio.h>
void shiftItems(int *a, int x_sz, int y_sz, int shift);
void shiftColRows(int *a, int x_sz, int y_sz, int x_shft, int y_shift);
int main(int argc, char *argv[])
{
int x_sz,y_sz; // razmernost' massiva
int x_shft,y_shft; // gorizontal'niy i vertical'niy sdvigi
int x,y,num; // peremennie dlya ciklov
int shift; // abs.velicsina szgviga
printf("Vvedite razmer po gorizontali: ");
cin>>x_sz;
printf("Vvedite razmer po verticali: ");
cin>>y_sz;
printf("\n\nVvedite gorizontal'niy i vertical'niy sdvigi:\n");
cin>>x_shft>>y_shft;
// preobr. levogo zdviga v pravij
if(x_shft<0)x_shft = x_sz + x_shft;
if(y_shft<0)y_shft = y_sz + y_shft;
// szozdaem i inicializiruem dinamicheskiy massiv
int a_size = y_sz*x_sz; // razmernoszty
int *matrix = new int[x_sz*y_sz];
// inicializaciya massiva
for(num=0;num<a_size;num++)
matrix[num]=num;
for(y=0;y<y_sz;y++)
{
printf("\n");
for(x=0;x<x_sz;x++)printf("%4d",matrix[y*x_sz+x]);
}
// abs.velicsina szdviga
shift = (y_shft*x_sz + x_shft)%a_size;
shiftColRows(matrix, x_sz, y_sz, x_shft, y_shft);
printf("\n");
for(y=0;y<y_sz;y++)
{
printf("\n");
for(x=0;x<x_sz;x++)printf("%4d",matrix[y*x_sz+x]);
}
printf("\n\nNazsmite ljubuju klavisu...");
delete[] matrix;
getch();
return 1;
}
void shiftItems(int *a, int x_sz, int y_sz, int shift)
{
int x, y;
int a_size = x_sz*y_sz;
char *flag = new char[a_size];
for(x=0;x<a_size;x++)
{
if(flag[x]==1)continue;
int h = a[x];
int y = (x + shift)%a_size;
while(true)
{
int buf = a[y];
a[y] = h;
h = buf;
flag[y] = 1;
if(y==x)break;
y = (y + shift)%a_size;
}
}
delete[] flag;
}
void shiftColRows(int *a, int x_sz, int y_sz, int x_shft, int y_shft)
{
int x, y;
int a_size = x_sz*y_sz;
char *flag = new char[a_size];
x_shft%=x_sz;
y_shft%=y_sz;
for(x=0;x<a_size;x++)
{
if(flag[x]==1)continue;
int h = a[x];
int col = (x+x_shft)%x_sz;
int row = y_shft;
int y = row*x_sz + col;
while(true)
{
int buf = a[y];
a[y] = h;
h = buf;
flag[y]=1;
if(y==x)break;
col = (col+x_shft)%x_sz;
row = (row+y_shft)%y_sz;
y = row*x_sz + col;
}
}
delete[] flag;
}