Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Циклический сдвиг элементов матрицы..

7.2K
10 сентября 2005 года
koder
24 / / 09.05.2005
Как осуществлить циклический сдвиг элеменитов прямоугольной матрицы на n элементов вправо или вниз, n может быть больше количества элементов в строке или столбце?
247
10 сентября 2005 года
wanja
1.2K / / 03.02.2003
Цитата:
Originally posted by koder
Как осуществлить циклический сдвиг элеменитов прямоугольной матрицы на 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;
Вправо сам переделаешь?

7.2K
11 сентября 2005 года
koder
24 / / 09.05.2005
Цитата:
Originally posted by wanja
Руками:
Влево:
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;
Вправо сам переделаешь?


неа, и вниз не знаю как

247
12 сентября 2005 года
wanja
1.2K / / 03.02.2003
Цитата:
Originally posted by koder
неа, и вниз не знаю как


Вправо:
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;

243
12 сентября 2005 года
pacific_7
1.9K / / 06.09.2004
Цитата:
Originally posted by koder
Как осуществлить циклический сдвиг элеменитов прямоугольной матрицы на n элементов вправо или вниз, n может быть больше количества элементов в строке или столбце?


А самому такое написать слабо? Ведь элементарно же.

488
12 сентября 2005 года
Mоngооsе
465 / / 01.04.2005
Цитата:
Originally posted by pacific_7
А самому такое написать слабо? Ведь элементарно же.

Если элементарно, тогда почему оба решения неправильны и почему ты это не замечаешь?

Пусть nx == 3; n == 3, т.е сдвиг на целую строку влево.

n:=n mod nx; // получаем n==0

for k:=1 to n do // что дальше не выполнется и все
// остается на месте.

Код:
for k := 1 to n do begin
  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;  // сдвиг вправо
243
12 сентября 2005 года
pacific_7
1.9K / / 06.09.2004
Цитата:
Originally posted by Mоngооsе
Если элементарно, тогда почему оба решения неправильны и почему ты это не замечаешь?[/code]


А потому что я даже в код не всматривался. Если человек не способен сам решить подобную ерундовую задачу, то ему программированием заниматься противопоказано и помогать таким людям - пустая трата времени.
Ты еще не устал решать задачки за студентов-двоечников?
Ведь это действительно простая задача.

488
12 сентября 2005 года
Mоngооsе
465 / / 01.04.2005
Цитата:
Originally posted by pacific_7
А потому что я даже в код не всматривался. Если человек не способен сам решить подобную ерундовую задачу, то ему программированием заниматься противопоказано и помогать таким людям - пустая трата времени.

ерундовая задача? Откуда знаешь? Ты же в ней не разобрался.

Цитата:
Ты еще не устал решать задачки за студентов-двоечников?

Если задача интересна, и есть пару минут, то могу его решить. Но эта задача и неинтересна и времени нет. Поэтому я только исправил предыдущий код.

Цитата:
Ведь это действительно простая задача.

Есть матрица nx*ny. Код выше, производит nx*ny*n сдвигов. Можно решить и с помощью nx*ny сдвигов и без отдельных ветвей для правого и левого сдвига. Ты смог бы закодировать такой ерундовый алгоритм?

243
12 сентября 2005 года
pacific_7
1.9K / / 06.09.2004
Цитата:
Originally posted by Mоngооsе
ерундовая задача? Откуда знаешь? Ты же в ней не разобрался.


Я такие задачи решал через месяц после того, как купил себе комп. Можешь конечно не верить, мне от этого ни холодно ни жарко.

Цитата:
Originally posted by Mоngооsе
Если задача интересна, и есть пару минут, то могу его решить. Но эта задача и неинтересна и времени нет. Поэтому я только исправил предыдущий код.


Ответь на один вопрос: ЗАЧЕМ???

Ну, раз ты решил бодаться :D и у меня закончился рабочий день(вечер???), то вот:

Цитата:
Originally posted by Mоngооsе

Есть матрица nx*ny. Код выше, производит nx*ny*n сдвигов. Можно решить и с помощью nx*ny сдвигов и без отдельных ветвей для правого и левого сдвига. Ты смог бы закодировать такой ерундовый алгоритм?


Есть другая мысля: поделить кол-во сдвигов на размерность матрици и сдвинуть ее на остаток от деления.
Если не нравится, то объясни зачем усложнять?

488
12 сентября 2005 года
Mоngооsе
465 / / 01.04.2005
Цитата:
Originally posted by pacific_7
Я такие задачи решал через месяц после того, как купил себе комп. Можешь конечно не верить, мне от этого ни холодно ни жарко.

Конечно, что верю. Я только сказал, что ты не разобрался в задаче, а не то что программировать не умеешь.

Цитата:
Ответь на один вопрос: ЗАЧЕМ???

потому-что мне интересно.

Цитата:
Есть другая мысля: поделить кол-во сдвигов на размерность матрици и сдвинуть ее на остаток от деления.Если не нравится, то объясни зачем усложнять?

Так алгоритм выше сдвигает на остаток от деления. Там не хватает 2 команды спереди.

n := n mod (nx*ny);
if n = 0 then exit;

И зачем писать оптимальные алгоритмы?

Допустим есть матрица 1024*1024, более миллиона элементов. Нужно сдвинуть влево на 300 элементов.
Алгоритм выше требует 300 миллион сдвигов, оптимальный 1 миллион сдвигов. Есть разница?

Pentiun IV 3.4G работает в 300 раз быстрее от напр. Pentium II 266M?

243
12 сентября 2005 года
pacific_7
1.9K / / 06.09.2004
Однако, как мы далеко углубились во флуд :)

Цитата:
Originally posted by Mоngооsе
Я только сказал, что ты не разобрался в задаче,


А я сказал, что я именно такие задачи (со сдвигами матриц) решал, т.е. я в ней разобрался как только прочитал условие.

Далее:

Цитата:
Originally posted by Mоngооsе

потому-что мне [color=blue]интересно[/color].


И

Цитата:
Originally posted by Mоngооsе
Но эта задача и [color=blue]неинтересна [/color]


Как понять??? Ты уж определись, что тебе интересно: поспорить со мной, или решить задачу :)

Цитата:
Originally posted by Mоngооsе

И зачем писать оптимальные алгоритмы?


Интересно, а что ты так завелся про оптимальные алгоритмы? У нас тут конкурс на оптимальнейший алгоритм года? Дело начиналось как будто-бы не с этого. И если уж на то пошло, то где он - оптимальный алгоритм? Почему-то ты сам написал не оптимальный.
Можно конечно брать отдельный элемент и сразу выщитывать у него сдвиг по горизонтали и по вертикали, заменять элемент на который он "проецируется", выщитывать его сдвиг и т.д. Только там масса нюансов которые я после 12-тичасовой смены в код воплотить не способен, да и не имею ни малейшего желания - есть более полезные задачи. Опять-таки, я не уверен, что он будет оптимальным, поэтому привел вариант который заведемо работает, пусть и не с лучшими характеристиками производительности/экономичности.
Ты уж не поленись, обнародуй нам оптимальный алгоритм собственного разлива.

488
13 сентября 2005 года
Mоngооsе
465 / / 01.04.2005
Цитата:
Originally posted by pacific_7
Однако, как мы далеко углубились во флуд :)

Как-то переживем.

Цитата:
Далее:

И

Как понять??? Ты уж определись, что тебе интересно: поспорить со мной, или решить задачу :)

Повторю еще раз. Могу решить задачу не вместо кого-то, а для себя если она интересна. В этой задаче ничего интересного нет, по-этому мне было жалко 15-30 минут на более сложный алгоритм решения.

Цитата:
Интересно, а что ты так завелся про оптимальные алгоритмы? У нас тут конкурс на оптимальнейший алгоритм года? Дело начиналось как будто-бы не с этого. И если уж на то пошло, то где он - оптимальный алгоритм? Почему-то ты сам написал не оптимальный.

Так я же не писал свой код, только исправил, то что было. И здесь идет речь в первую очередь не об оптимальном алгоритме. А о том, что ты чела обозвал студентом-двоечником, и не исключено, что нормального алгоритма для решения этой задачи сам написать не сможешь. :)

Цитата:
Можно конечно брать отдельный элемент и сразу выщитывать у него сдвиг по горизонтали и по вертикали, заменять элемент на который он "проецируется", выщитывать его сдвиг и т.д.

Ну так в чем проблема? Не имеешь 15 минут, чтоб закодировать?

Цитата:
Только там масса нюансов которые я после 12-тичасовой смены в код воплотить не способен, да и не имею ни малейшего желания - есть более полезные задачи.

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

Цитата:
Ты уж не поленись, обнародуй нам оптимальный алгоритм собственного разлива.

Я не хочу тебя позорить. Так как задача действительно проста. Может все ж таки сам напишешь?

243
13 сентября 2005 года
pacific_7
1.9K / / 06.09.2004
Цитата:
Originally posted by Mоngооsе

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


А как же "мне интересно"? Ладно, проехали, видимо ты на это так и не ответишь.

Цитата:
Originally posted by Mоngооsе

и не исключено, что нормального алгоритма для решения этой задачи сам написать не сможешь.


На понт берешь? Ну-ну...

Цитата:
Originally posted by Mоngооsе

Не имеешь 5 минут, чтоб закодировать?


А ты когда-нибудь работал в служебе поддержки пользователей что бы так говорить? К тому же на работе компилера пока (:)) нет.

Цитата:
Originally posted by Mоngооsе

Ага. Сперва была элементарная задача,


Ага, такая и есть.

Цитата:
Originally posted by Mоngооsе

Я не хочу тебя позорить.


Ай! ОЙ! Плакать буду! Не обижайте меня! Вообще - подобные фразы это отмазка номер 1 в мире.
Не я первый начал говорить про оптимальный алгоритм. И не я его предлагал. Где же он?

Ладно, раз на то пошло, то можно и не поспать еще немного. Вот от меня на вскидку:

Код:
int main(int argc, char *argv[])
{
  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;
}

На идеальность и оптимальность он не претендует, но пожалуй "порвет" по скорости тот вариант, что я предложил перед этим. Конечно при достаточном количестве памяти.
Жду твой оптимальный код.
243
13 сентября 2005 года
pacific_7
1.9K / / 06.09.2004
Хм... Забыл delete matrix2.
252
13 сентября 2005 года
koderAlex
1.4K / / 07.09.2005
В таких задачках скорость работы с данными зависит от их представления в памяти . В данном случае лучше всего подойдёт представление матрицы в виде дву направленного списка . Работа с отдельными элементами будет чуть медленнее , зато её сдвиг будет быстрее .
488
13 сентября 2005 года
Mоngооsе
465 / / 01.04.2005
Какой горизонтальный и вертикальный сдвиг? Сдвиг задается одним числом n. Но пусть будет. Довольно много багов при инициализации. Но пусть и они будут. Но если взять конкретный пример. Матрица 3*3, сдвиг вправо на 1 позицию и вниз тоже на одну позицию, т.е. сдвиг вправо на 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

после сдвига

8 6 7
2 0 1
5 3 4

вместо

5 6 7
8 0 1
2 3 4
т.е. алгоритм не правильный. Можно подправить твой вариант.
Код:
#include <iostream.h>
#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 решения, а ты ни одно.
243
13 сентября 2005 года
pacific_7
1.9K / / 06.09.2004
Цитата:
Originally posted by Mоngооsе
Какой горизонтальный и вертикальный сдвиг? Сдвиг задается одним числом n.


Моя твоя не понимать. Хочешь сказать, что по диагонали? Или змейкой? То ты вообще хочешь сказать? Ты можешь по человечески объяснить своё задание?

Цитата:
Originally posted by Mоngооsе
Но пусть будет. Довольно много багов при инициализации.


Каких?

Цитата:
Originally posted by Mоngооsе
Но пусть и они будут. Но если взять конкретный пример. Матрица 3*3, сдвиг вправо на 1 позицию и вниз тоже на одну позицию, т.е. сдвиг вправо на 4.


Ни хрена (пардон) не понял что ты хочешь. Можешь поконкретнее задание растолковать? Какой сдвиг вправо на 4??? У нас есть сдвиг в право и сдвиг вниз, если ты сам не забыл начальное задание. Я не телепат, что бы читать твои мысли и понять, что ты хочешь.

Цитата:
Originally posted by Mоngооsе
(Если задать сдвиг влево и вверх, т.е. x_shft, y_shft<0, получим выход за пределы второго массива).


Еще раз: ЧИТАЙ ЗАДАНИЕ!!! Где там про сдвиги влево и вверх??? И потом, тебе что, трудно поменять по условию знак в выражении вычисления сдвига? Или самому ума не хватит?

Цитата:
Originally posted by Mоngооsе

Имеем в начале
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

Т.е. ты вообще не понял, как работает моя программа, с самых начальных строк, и после этого пытаешься мне говорить про то, что я не понимаю задания.

Цитата:
Originally posted by Mоngооsе

после сдвига

5 6 7
8 0 1
2 3 4


И каким рожном это получилось из одного сдвига вниз и одного сдвига вправо??? Кто нибудь кроме Mоngооsе это знает? Тут какой-то сдвиг "змейкой". Верно Mоngооsе? Естественно моя прога работает не так, т.к. она сдвигает по заданию а не по мыслям в ТВОЕЙ голове!

За дальнейшее дико извиняюсь, но у меня просто уже не хватает терпения выслушивать клевету в свой адрес

Цитата:
Originally posted by Mоngооsе

т.е. алгоритм не правильный. Можно подправить твой вариант.


Ты чё тут паришь шут гороховый??? Какой алгоритм не правильный? Чё ты тут всем "подправить" пытаешься??? Ты самостоятельно можешь написать хоть одну строчку кода, а не подправлять остальных??? Это очень похоже на попытки опустить БГ малолетним ламьем ("windows must die") которое само нифига сделать не может, кроме критики других.

Цитата:
Originally posted by Mоngооsе
Но это не та задача и не тот язык.


А где в задании идет речь о конкретном ЯП??? Укажи пожалуйста номер того слова в первом посте топика, где указано название языка. Иначе - прекрати свой безосновательный базар о том, что можно, а что нельзя и на чем мне писать. В ветку по Паскалю я например даже и не захожу т.к. мне субъективно не нравится этот язык!

Разуй глаза и прочти еще раз:

Цитата:
Originally posted by koder

Как осуществлить циклический сдвиг элеменитов прямоугольной матрицы на n элементов [color=blue]вправо или вниз[/color], n может быть больше количества элементов в строке или столбце?


Я свой вариант решения привел строго по задаче - там есть сдвиг вниз и сдвиг вправо, а то что ты там понаисправлял, даже смотреть не собираюсь.

Цитата:
Originally posted by Mоngооsе

И о создании дополнительного массива речи не было.


Ага, и об использовании оператора присваивания тоже речи не было. Может ты сам не прав и нужно заюзать CopyMemory??? ;) Каждый программист решает задание по своему. Результат достигнут? Достигнут! Он верен? Верен! Что тебе еще?

Цитата:
Originally posted by Mоngооsе

Значит Паскаль.


Значит кончай пургу мести! При чем тут Паскаль твой??? Ты вообще кто такой, что бы устанавливать правила на чем писать? Ты заблудился? Ветка называется "Общие вопросы программирования", а не "Программирования на Паскале", т.е. полная свобода выбора языка. Да хоть асм!

Цитата:
Originally posted by Mоngооsе

Есть один массив a[ny, nx]. Второй массив не создается. Сдвиг задается одним числом n. Если n > 0, тогда сдвиг вправо, если меньше нуля, тогда сдвиг влево.


Ты наконец догнал, что у нас форум по IT, а не по телепатиии! И решил привести свое задание в письменном виде. Я так понял, что это так сказать сдвиг "змейкой"? И что тут такого сложного? Делим количество сдвигов на горизонтальную размерность массива с отбрасыванием остатка от деления, если получаем число большее вертикальной размерности массива, то делим его через MOD на вертикльную разменость и получаем номер строки (нумерация идет с нуля), иначе номер строки у нас и так есть. Далее - делим число сдвигов опять через MOD на горизонтальную размерность - это номер столбца. Берем тот элемент в буфер, присваиваем на его место взятый ранее элемент и повторяем итерацию но уже с новыми, только что вычисленными значениями. Количество итераций равно количеству элементов массива.
Сложно??? По-моему не сложнее обычного циклического сдвига.

Цитата:
Originally posted by Mоngооsе

Я бы с радостью написал свой код,


Напиши! Порадуй себя и окружающих бездельников. А то ты как Бобер когда то: угрожал всем своим большим проектом.
Не в обиду Бобру, т.к. он исправился и публично извинился и притензий к нему думаю ни у кого нет. Просто пасторальный пример получился :) Бобр - не серчай!

Цитата:
Originally posted by Mоngооsе

но я уже привел 2 решения, а ты ни одно.


Решения чего??? Здачи которую знал только ты?
И пока ты не объяснишь, чем же не правильно мое решение для поставленной koder'ом задачи, или не возьмешь свои слова назад, дальнейшие дискусии я вести отказываюсь по причине их абсолютной нецелесообразности и твоей не состоятельности как опонента для дискуссии. ;)

488
13 сентября 2005 года
Mоngооsе
465 / / 01.04.2005
Зевс, ты психуешь, значит ты не прав. :)
Слышал эту поговорку?

Давай для начала разберемся с твоим шедевром.

Размерность массива 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 баг?

Я в твоей программе нашел пять багов, но ни с кем тебя не сравнивал и не обзывал.
И если ты макс. что можешь, так это переходить на личности, тогда дискуссию на этом можно закончить.
243
13 сентября 2005 года
pacific_7
1.9K / / 06.09.2004
Цитата:
Originally posted by Mоngооsе

Размерность массива x_sz, y_sz.
Но ты оба раза создаешь массивы размерности x_sz*x_sz.
Выделяешь память через new[], но удаляешь через delete, вместо delete[]. Это 3 бага.


С этим ты прав - невнимательность и спешка рулит (есть еще одна хорошая пословица, напоминать не буду), но в каком состоянии я был, когда все это писал, я уже намекал. Честно говоря всмотревшись в это всё, с нормально работающей головой, я сам подивился :)
Я получил хороший урок: ни когда не начинай делать даже простейшую задачу если чувствуешь, что не в состоянии сделать ее сейчас.
А тебе ведь надо было меня поддеть? ;)

Цитата:
Originally posted by Mоngооsе
Если тебе лучше нравится С, пусть будет C (мне все равно). Значит сможешь реализовать свой алгоритм


Смогу. Знаешь, год назад я бы уже сидел и кодировал его. Но к сожалению (или счастью) мне сейчас есть чем заняться более полезным и интересным.
Кстати, я уже предложил именно такой алгоритм, который ты хотел. Ты его решил проигнорировать? Ведь это именно то, о чем ты рассуждал.

Цитата:
Originally posted by Mоngооsе

Я в твоей программе нашел пять багов, но ни с кем тебя не сравнивал и не обзывал.


Конечно, я поступил не цветочно, но тебе не кажется, что ты на данный момент не лучше меня? И трудно наверное было все баги сразу выложить? Все же тебе нравится людей злить.
Сколько раз уже ты говрил про то, какую ты замечательную программу можешь написать. И где она? Или ты боишься тоже ошибиться? У тебя на нее времени было уже более суток, а я свое "творение" выложил сразу, как только оно пришло мне в голову. Уж сейчас-то наверное у тебя багов в программе точно не будет. Жду.

488
13 сентября 2005 года
Mоngооsе
465 / / 01.04.2005
Цитата:
Originally posted by pacific_7
Конечно, я поступил не цветочно, но тебе не кажется, что ты на данный момент не лучше меня? И трудно наверное было все баги сразу выложить? Все же тебе нравится людей злить.

Мне кажется, ты меня путаешь с 13 летним кул хацкером из Усть-Илимска. Это он любит людей злить.

Цитата:
Сколько раз уже ты говорил про то, какую ты замечательную программу можешь написать. И где она? Или ты боишься тоже ошибиться? У тебя на нее времени было уже более суток, а я свое "творение" выложил сразу, как только оно пришло мне в голову. Уж сейчас-то наверное у тебя багов в программе точно не будет. Жду.

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

Если не сегодня, то завтра к вечеру напишу код.

243
13 сентября 2005 года
pacific_7
1.9K / / 06.09.2004
Цитата:
Originally posted by Mоngооsе
Мне кажется, ты меня путаешь с 13 летним кул хацкером из Усть-Илимска. Это он любит людей злить.


Усть-Урюпинска кажись :) Да дадно тебе отмазываться, это есть и у тебя и у меня и много у кого еще. Нельзя быть идеальным.

Цитата:
Originally posted by Mоngооsе
А ты не заметил, во сколько я написал сегодняшний первый пост? Это я не так рано встал, а просто тогда закончил работу.


И? Работа разная бывает.

Цитата:
Originally posted by Mоngооsе

Если не сегодня, то завтра к вечеру напишу код.


Какой конкретно? Я честно говоря уже запутался :).
Тебе во истину делать видимо по жизни нечего. Счастливый ты человек в отношении свободного времени.
ЗЫ Кто-то говорил про 15-30 минут. Что, у тебя до сих пор не нашлось полчасика? ;) Можешь не отвечать, просто я показал тебе корректность подобных вопросов.

2.0K
16 сентября 2005 года
WidowMaker
212 / / 05.04.2005
Бла-бла-бла...
:angel: А я то думал, прочитав топ, что хватит и минуты прочитать.
Слово об оптимизации.
В мат. лабах матрицы хранятся не как 2д массивы. а как линейки строки и работают с ними блочно, а столбцовые сдвиги можно делать умножением(сейчас уже не вспомню как, но было дело...).:}
243
16 сентября 2005 года
pacific_7
1.9K / / 06.09.2004
Цитата:
Originally posted by WidowMaker
Бла-бла-бла...
:angel: А я то думал, прочитав топ, что хватит и минуты прочитать.


Неужели все прочитал :D?

Цитата:
Originally posted by WidowMaker

Слово об оптимизации.
В мат. лабах матрицы хранятся не как 2д массивы.


Да вообще - массивы любой размерности хранятся в памяти как последовательность байтов а все измерения вычисляются смещением адреса.
Матрица - это чисто логическое представление. Знаете, что из себя представляет планка DDR внутри? И вот попробуйте создать там физически матрицу, а еще лучше - 3-х мерный массив. :)

2.0K
16 сентября 2005 года
WidowMaker
212 / / 05.04.2005
Цитата:
Originally posted by pacific_7
Неужели все прочитал :D?


Делать больше нечего, я учусь :angel:

Цитата:

Да вообще - массивы любой размерности хранятся в памяти как последовательность байтов а все измерения вычисляются смещением адреса.
Матрица - это чисто логическое представление. Знаете, что из себя представляет планка DDR внутри? И вот попробуйте создать там физически матрицу, а еще лучше - 3-х мерный массив. :)



Просто когда выделяешь динамик. массив, то тут возникают проблемы с мемкопи и т.п.

488
18 сентября 2005 года
Mоngооsе
465 / / 01.04.2005
2 pacific_7
ShiftItems - сдвигает по элементам,
shiftColRows - по столбцам/строкам.

Из-за того, что могут быть замкнутые пути, пришлесь создать вектор для проверки того, был ли текущий элемент "сдвинут".
Код:
//#include <iostream.h>
#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;
}
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог