Skip to content

Instantly share code, notes, and snippets.

@jianminchen
Created December 7, 2016 06:52
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/1c1c07b5454a43d493264c6db4444ea3 to your computer and use it in GitHub Desktop.
Save jianminchen/1c1c07b5454a43d493264c6db4444ea3 to your computer and use it in GitHub Desktop.
Matrix Rotation - Code review - study code No. 3
using System;
using System.Collections.Generic;
using System.Collections;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
string parameters = Console.ReadLine();
string[] par = parameters.Split(new char[]{' '});
int rows = int.Parse(par[0]);
int columns = int.Parse(par[1]);
int r = int.Parse(par[2]);
string line;
int[,] mat = new int[rows,columns];
for (int i = 0; i < rows; i++) {
line = Console.ReadLine();
int[] row = lineToRow(line, columns);
for (int j = 0; j < columns; j++)
{
mat[i, j] = row[j];
}
}
int ring = 0;
int maxRing = rows/2;
if (columns / 2 < maxRing) maxRing = columns / 2;
int[,] newMatrix = new int[rows, columns];
while (ring < maxRing)
{
List<int> vector = getRing(mat, rows, columns, ring);
//int[] rotatedVector = rotateVector(vector, r);
//writeRing(newMatrix, rows, columns, ring, rotatedVector);
rotateVector(vector, r);
writeRing(newMatrix, rows, columns, ring, vector);
ring++;
}
printMatrix(newMatrix, rows, columns);
Console.ReadKey();
}
private static List<int> getRing(int[,] mat, int rows, int columns, int ring)
{
List<int> vector = new List<int>();
for (int i = 0 + ring; i < rows - ring; i++)
vector.Add(mat[i, 0 + ring]);
for (int i = 1 + ring; i < columns - ring; i++)
vector.Add(mat[rows - ring - 1, i]);
for (int i = rows - ring - 2; i > 0 + ring; i--)
vector.Add(mat[i, columns - ring - 1]);
for (int i = columns - ring - 1; i >= 1 + ring; i--)
vector.Add(mat[0 + ring, i]);
return vector;
}
private static void writeRing(int[,] mat, int rows, int columns, int ring, List<int> vector)
{
int k = 0;
int n = 0;
int i = ring;
int repeticion = rows - ring*2;
while (n<repeticion){
mat[i,ring] = vector[k];
k++;
n++;
i++;
}
n = 0;
repeticion = (columns-2*ring)-1;
i = ring+1;
while (n < repeticion)
{
mat[rows-ring-1, i] = vector[k];
k++;
n++;
i++;
}
repeticion = (rows - 2 * ring) - 1;
n = 0;
i = (rows -1 - ring) - 1;
while (n < repeticion)
{
mat[i, (columns - ring) - 1] = vector[k];
k++;
n++;
i--;
}
repeticion = (columns - 2 * ring) - 1 -1;
n = 0;
i = (columns -1 -ring) - 1;
while (n < repeticion)
{
mat[ring, i] = vector[k];
k++;
n++;
i--;
}
}
private static void rotateVector(List<int> src, int r)
{
int offset = r;
if (r>=src.Count) offset = r % src.Count;
int[] blankData = new int[offset];
int n = src.Count;
for (int j = 0, i = n - offset; i < n; i++, j++)
blankData[j] = src[i];
src.RemoveRange(n-offset,offset);
src.InsertRange(0, blankData);
}
//private static int[] rotateVector(List<int> src, int r)
//{
// int k = 0;
// int[] vector = new int[src.Count];
// for (int i = 0; i < src.Count; i++)
// {
// int step = 0;
// k = i;
// while (step < r)
// {
// k++;
// step++;
// if (k >= src.Count) k = 0;
// }
// vector[k] = src[i];
// }
// return vector;
//}
private static int[] lineToRow(string line, int columns)
{
string[] elements = line.Split(new char[] { ' ' });
int[] row = new int[columns];
for (int i = 0; i < columns; i++)
{
row[i] = int.Parse(elements[i]);
}
return row;
}
private static void printMatrix(int[,] mat, int rows, int columns)
{
for (int i=0; i<rows; i++){
for (int j = 0; j < columns; j++) {
if (j != 0) Console.Write(' ');
Console.Write(mat[i, j]);
}
Console.WriteLine();
}
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment