# Shift all matrix elements by 1 in spiral order

Posted in

Last updated on September 8, 2024

## Problem

Given an M x N matrix, shift all its elements by 1 in spiral order

Sample Input

```{
{ 1, 2, 3, 4, 5},
{16, 17, 18, 19, 6},
{15, 24, 25, 20, 7}
}```

#### Sample Output

```19 1 2 3 4
15 16 17 18 5
24 25 20 7 6```

### Approach

We can traverse through the matrix in a spiral manner and replace each element with its previous one. This problem largely resembles the “Print Matrix in Spiral Form” problem. The time complexity of this problem would be O( M x N ).

#### C++

```#include<bits/stdc++.h>
usingnamespacestd;
// Function to shift all matrix elements by 1 in spiral order
voidsolve(int matrix[3][5], int row, int column)
{
int top = 0, bottom = row - 1;
int left = 0, right = column - 1;
int prev = matrix[0][0];
while (true)
{
if (left > right) {
break;
}
// shift top row
for (int i = left; i <= right; i++) {
swap(matrix[top][i], prev);
}
top++;
if (top > bottom) {
break;
}
// shift right column
for (int i = top; i <= bottom; i++) {
swap(matrix[i][right], prev);
}
right--;
if (left > right) {
break;
}
// shift bottom row
for (int i = right; i >= left; i--) {
swap(matrix[bottom][i], prev);
}
bottom--;
if (top > bottom) {
break;
}
// shift left column
for (int i = bottom; i >= top; i--) {
swap(matrix[i][left], prev);
}
left++;
}
// the first element of the matrix will be the last element replaced
matrix[0][0] = prev;
}
intmain()
{
int matrix[3][5] =
{
{ 1, 2, 3, 4, 5},
{16, 17, 18, 19, 6},
{15, 24, 25, 20, 7}
};
int row = 3;
int column = 5;
solve(matrix, row, column);
for (int i=0; i<row; i++) {
for (int j=0; j<column; j++) {
cout << matrix[i][j]<<" ";
}
cout << "\n";
}
return0;
}```

#### Output

```19 1 2 3 4
15 16 17 18 5
24 25 20 7 6```

#### C

```#include<stdio.h>
voidswap(int *a, int *b){
int temp = *a;
*a = *b;
*b = temp;
}
// Function to shift all matrix elements by 1 in spiral order
voidsolve(int matrix[3][5], int row, int column)
{
int top = 0, bottom = row - 1;
int left = 0, right = column - 1;
int prev = matrix[0][0];
while (1)
{
if (left > right) {
break;
}
// shift top row
for (int i = left; i <= right; i++) {
swap(&matrix[top][i], &prev);
}
top++;
if (top > bottom) {
break;
}
// shift right column
for (int i = top; i <= bottom; i++) {
swap(&matrix[i][right], &prev);
}
right--;
if (left > right) {
break;
}
// change bottom row
for (int i = right; i >= left; i--) {
swap(&matrix[bottom][i], &prev);
}
bottom--;
if (top > bottom) {
break;
}
// shift left column
for (int i = bottom; i >= top; i--) {
swap(&matrix[i][left], &prev);
}
left++;
}
// the first element of the matrix will be the last element replaced
matrix[0][0] = prev;
}
intmain()
{
int matrix[3][5] =
{
{ 1, 2, 3, 4, 5},
{16, 17, 18, 19, 6},
{15, 24, 25, 20, 7}
};
int row = 3;
int column = 5;
solve(matrix, row, column);
for (int i=0; i<row; i++) {
for (int j=0; j<column; j++) {
printf("%d ",matrix[i][j]);
}
printf("\n");
}
return0;
}```

#### Output

```19 1 2 3 4
15 16 17 18 5
24 25 20 7 6```

#### Python

```defsolve(matrix):
top = 0
bottom = len(matrix) - 1
left = 0
right = len(matrix[0]) - 1
prev = matrix[0][0]
whileTrue:
if left > right:
break
# shift top row
for i in range(left, right + 1):
temp = matrix[top][i]
matrix[top][i] = prev
prev = temp
top = top + 1
if top > bottom:
break
# shift right column
for i in range(top, bottom + 1):
temp = matrix[i][right]
matrix[i][right] = prev
prev = temp
right = right - 1
if left > right:
break
# shift bottom row
for i in range(right, left - 1, -1):
temp = matrix[bottom][i]
matrix[bottom][i] = prev
prev = temp
bottom = bottom - 1
if top > bottom:
break
# shift left column
for i in range(bottom, top - 1, -1):
temp = matrix[i][left]
matrix[i][left] = prev
prev = temp
left = left + 1
# first element of the matrix will be the last element replaced
matrix[0][0] = prev
matrix = [
[ 1, 2, 3, 4, 5],
[16, 17, 18, 19, 6],
[15, 24, 25, 20, 7]
]
solve(matrix)
print(matrix)```

#### Output

`[[19, 1, 2, 3, 4], [15, 16, 17, 18, 5], [24, 25, 20, 7, 6]]`