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

Ваш аккаунт

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

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

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

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

10K
25 ноября 2006 года
Omega Red
49 / / 15.10.2006
Условие:
Осуществить циклический сдвиг элементов матрицы размерности MxN вправо на k элементов таким образом: элементы 1-й строки сдвигаются в последний столбец сверху вниз, из него — в последнюю строку справа налево, из нее – в первый столбец снизу вверх, из него — в первую строку; для - остальных элементов — аналогично.

Как это выглядит, представляю. Но как реализовать это на деле - непонятно. Я пытался сделать для двухмерного массива, по теории должно было работать, но после печати исходного массива окно закрывается.
Вот код для внешних элемнтов матрицы:
Цитата:
#include "iostream.h"

int i, j, n, m, s, **a, **b;
int main()
{
cout<<"Vvedite kolichestvo strok:"<<endl;
cin>>n;
cout<<"Vvedite kolichestvo stolbcov:"<<endl;
cin>>m;
cout<<"Vvedite sdvig elemenrov"<<endl;
cin>>s;

if (n < 0 || m < 0) return -1;

a = new int *[n];
b = new int *[n];
for (i = 0; i < n; i++)
{
a = new int [m];
b = new int [m];
}

for (i = 0; i < n; i++)
for (j = 0; j < m; j++)
{
cout<<"("<<i+1<<")("<<j+1<<"): ";
cin>>a[j];
b[j] = 0;
}

cout<<"Ishodniy massiv:"<<endl;

for (i = 0; i < n; i++)
{
for (j = 0; j < m; j++)
{
cout<<a[j]<<" ";
}
cout<<endl;
}
i = 0;
/*Допустим есть массив [3][3], сдвиг элементов 2*/
for (j = 1; j < m; j++)
{
if (j + s >= m)
b[i + (j+s) - (m-1)][m-1] = a[j]; //b[1][2]=a[0][1], b[2][2]=a[0][2]
else
b[j+s] = a[j];
}

for (i = 1; i < n; i++)
{
if (i + s >= n)
b[n-1][j - (i+s) + (n-1)] = a[j]; //b[2][1]=a[1][2], b[2][0]=a[2][2]
else
b[i+s][j] = a[j];
}

for (j = m-2; j >= 0; j--)
{
if (j - s < 0)
b[i + (j-s)][0] = a[j]; //b[1][0]=a[2][1], b[0][0]=a[2][0]
else
b[j-s] = a[j];
}

for (i = n-2; i >= 0; i--)
{
if (i - s < 0)
b[0][j - (i-s)] = a[j]; //b[0][1]=a[1][0], b[0][2]=a[0][0]
else
b[i-s][j] = a[j];
}

cout<<"Smeschenniy massiv:"<<endl;
for (i = 0; i < n; i++)
{
for (j = 0; j < m; j++)
{
cout<<b[j]<<" ";
}
cout<<endl;
}
return 0;
}

355
25 ноября 2006 года
&lt;SCORP&gt;
786 / / 21.10.2006
а я чёт не представил как это выглядит...
Цитата:
элементы 1-й строки сдвигаются в последний столбец сверху вниз

это как?? элементы первой строки могут, как я понимаю, могут к последнему столбцу сдвигаться одним способом -- слева направо.
или я вообще чего-то не понимаю?

10K
25 ноября 2006 года
Omega Red
49 / / 15.10.2006
Допустим исходный массив:
1 2 3 4
7 3 1 9
5 8 3 0
4 4 4 4

Если сделать сдвиг на два элемента, должно получится:
5 7 1 2
4 3 8 3
4 1 3 4
4 4 0 9

Как бы элементы первой строки должны сначала идти вправо, а потом вниз по углу.
355
25 ноября 2006 года
&lt;SCORP&gt;
786 / / 21.10.2006
ну, как я понимаю...... то елементы по периметру двигаются покругу, а как внутренние? и ещё тем более когда матрица не NxN, MxN где M!=N
10K
25 ноября 2006 года
Omega Red
49 / / 15.10.2006
С внутренними я попробую внешний цикл поставить и как-нибудь связать. Вот сейчас хочу узнать, почему так не работает!
242
26 ноября 2006 года
Оlga
2.2K / / 04.02.2006
проверила с матрицей 4*4, и с 4*5 - работает, правда решение оставляет желать лучшего =). если устроит, под свои нужды изменишь код:
Код:
#include <stdio.h>
#define ROW 4
#define COL 4  //5
void print_matrix(int mat[][COL])
{
 for(int i = 0; i < ROW; i++)
 {
  for(int j = 0; j < COL; j++)
   printf("%4d", mat[j]);
 
  printf("\n\n");
 }
 printf("\n\n\n\n");
}
void main(void)
{
 //int arr[ROW][COL] = {{1,2,3,4, 5}, {14, 21, 22, 23, 6}, {13, 26, 25, 24, 7}, {12, 11, 10, 9, 8}};
 int arr[ROW][COL] = {{1,  2,  3, 4},
      {12, 21, 22, 5},
      {11, 24, 23, 6},
      {10, 9, 8, 7}};
 int i, j, k, temp, temp2;
 print_matrix(arr);
 for(i = 0; i < ROW/2; i++)
 {
  for(int rotate = 2; rotate; rotate--) //кол-во сдвигов - к
  {
   for(j = i, temp = arr[j]; j < COL-1-i; j++)
   {
    temp2 = arr[j+1];
    arr[j+1] = temp;
    temp = temp2;
   }
   for(k = i+1; k < ROW-i; k++)
    temp ^= arr[k][j] ^= temp ^= arr[k][j];
 
   for( j--, k--; j >= i; j--)
    temp ^= arr[k][j] ^= temp ^= arr[k][j];
 
   for(j++, k--; k >= i; k--)
    temp ^= arr[k][j] ^= temp ^= arr[k][j];
  }
 }
 print_matrix(arr);
}
10K
26 ноября 2006 года
Omega Red
49 / / 15.10.2006
С первыми циклами fоr разобрался: первый для количества перемещаемых кругов, второй для количества сдвигов, третий для замены элементов.
Только вот не понимаю, что значат операции ^= и как действует их связывание?
242
26 ноября 2006 года
Оlga
2.2K / / 04.02.2006
Цитата: Omega Red
С первыми циклами fоr разобрался: первый для количества перемещаемых кругов, второй для количества сдвигов


правильно

Цитата:
третий для замены элементов.
Только вот не понимаю, что значат операции ^= и как действует их связывание?


не только 3-ий, но и последущии 3 фора - все они меняют элементы. 4 цикла - что-бы обработать вкруговую, но должно быть решение попроще, имхо.
^ - оператор ХОR
есть несколько способов поменять значения 2-ух переменных:

Код:
int a = 3, b =78;
 
// 1 variant
int temp = a;
a = b;
b = temp;
printf("a = %d, b = %d\n\n", a, b);
 
// 2 variant
a ^=  b; // a = a^b;
b ^=  a;
a ^= b;
printf("a = %d, b = %d\n\n", a, b);
//or
a ^= b ^= a ^= b; //более короткая запись
printf("a = %d, b = %d\n\n", a, b);
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог