#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);
}
Циклический сдвиг элементов матрицы
Осуществить циклический сдвиг элементов матрицы размерности 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;
}
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;
}
Цитата:
элементы 1-й строки сдвигаются в последний столбец сверху вниз
это как?? элементы первой строки могут, как я понимаю, могут к последнему столбцу сдвигаться одним способом -- слева направо.
или я вообще чего-то не понимаю?
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
Как бы элементы первой строки должны сначала идти вправо, а потом вниз по углу.
ну, как я понимаю...... то елементы по периметру двигаются покругу, а как внутренние? и ещё тем более когда матрица не NxN, MxN где M!=N
С внутренними я попробую внешний цикл поставить и как-нибудь связать. Вот сейчас хочу узнать, почему так не работает!
проверила с матрицей 4*4, и с 4*5 - работает, правда решение оставляет желать лучшего =). если устроит, под свои нужды изменишь код:
Только вот не понимаю, что значат операции ^= и как действует их связывание?
Цитата: 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);
// 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);