Skip to content

Instantly share code, notes, and snippets.

@jianminchen
Created April 15, 2016 06:02
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jianminchen/c0f91e5f5406c3dce35ce48c4c646c33 to your computer and use it in GitHub Desktop.
Save jianminchen/c0f91e5f5406c3dce35ce48c4c646c33 to your computer and use it in GitHub Desktop.
Matrix Rotation - study the code
using System;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.IO;
using System.Numerics;
using System.Collections;
using System.Collections.Generic;
static class Program
{
static void Main(string[] args)
{
string[] parts = Console.ReadLine().Split(' ');
int m = Convert.ToInt32(parts[0]);
int n = Convert.ToInt32(parts[1]);
long r = Convert.ToInt64(parts[2]);
long[,] matrix = new long[m, n];
for (int row = 0; row < m; row++)
{
parts = Console.ReadLine().Split(' ');
for (int col = 0; col < parts.Length; col++)
{
matrix[row, col] = Convert.ToInt64(parts[col]);
}
}
int limit = Math.Min(m, n) / 2;
for (int i = 0; i < limit; i++)
{
long[] layer = ReadLayerInMatrix(matrix, m, n, i, i);
RotateLayer(layer, r);
WriteLayerInMatrix(matrix, m, n, i, i, layer);
}
for (int row = 0; row < m; row++)
{
for (int col = 0; col < n; col++)
{
Console.Write("{0} ", matrix[row, col]);
}
if (row != m - 1)
{
Console.WriteLine();
}
}
}
static void WriteLayerInMatrix(long[,] matrix,
int m,
int n,
int startRow,
int startCol,
long[] layer)
{
int index = 0;
for (int c = startCol; c <= n - startCol - 1; c++)
{
matrix[startRow, c] = layer[index++];
}
for (int r = startRow + 1; r <= m - startRow - 1; r++)
{
matrix[r, n - startCol - 1] = layer[index++];
}
for (int c = n - startCol - 2; c >= startCol; c--)
{
matrix[m - startRow - 1, c] = layer[index++];
}
for (int r = m - startRow - 2; r > startRow; r--)
{
matrix[r, startCol] = layer[index++];
}
}
static long[] ReadLayerInMatrix(long[,] matrix,
int m,
int n,
int startRow,
int startCol)
{
int lenOutputArray = 2 * (m - 2 * startRow) + 2 * (n - 2 * startCol - 2);
long[] layer = new long[lenOutputArray];
int index = 0;
for (int c = startCol; c <= n - startCol - 1; c++)
{
layer[index++] = matrix[startRow, c];
}
for (int r = startRow + 1; r <= m - startRow - 1; r++)
{
layer[index++] = matrix[r, n - startCol - 1];
}
for (int c = n - startCol - 2; c >= startCol; c--)
{
layer[index++] = matrix[m - startRow - 1, c];
}
for (int r = m - startRow - 2; r > startRow; r--)
{
layer[index++] = matrix[r, startCol];
}
return layer;
}
static void RotateLayer(long[] layer,
long r)
{
long[] layerTemp = new long[layer.Length];
for (int i = 0; i < layer.Length; i++)
{
int index = (int)((i - r) % layer.Length);
if(index < 0)
{
index += layer.Length;
}
layerTemp[index] = layer[i];
}
for (int i = 0; i < layer.Length; i++)
{
layer[i] = layerTemp[i];
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment