zoukankan      html  css  js  c++  java
  • 旋转二维数组

       1:      /// <summary>
       2:      /// Q:Given an image represented by an NxN matrix, where each pixel in the image is 4 bytes, 
       3:      /// write a method to rotate the image by 90 degrees. Can you do this in place?
       4:      /// </summary>
       5:      class Program
       6:      {
       7:          static void Main(string[] args)
       8:          {
       9:              Program p = new Program();
      10:              int[,] matrix = new int[3, 4] { { 1, 2, 3, 4 }, { 5, 6, 7, 8 }, { 9, 10, 11, 12 } };
      11:              int[,] matrix2 = new int[4, 4] { { 1, 1, 1, 1 }, { 2, 2, 2, 2 }, { 3, 3, 3, 3 },{4,4,4,4} };
      12:              int[,] matrix3 = new int[4, 4] { { 1, 2, 3, 4 }, { 1, 2, 3, 4 }, { 1, 2, 3, 4 }, { 1, 2, 3, 4 } };
      13:              int[,] matrix4 = new int[3,3] { { 1, 2, 3 }, { 4,5,6 }, { 7,8,9 } };
      14:              int[,] matrix5 = new int[4, 4] { { 1, 2, 3,4 }, { 5,6,7,8 }, { 9,10,11,12 },{13,14,15,16} };
      15:              int[,] matrix6 = new int[3, 2] { { 1, 2}, { 3,4},{5,6} };
      16:              int[,] result = p.RotateMatrixWith90Degree(matrix);
      17:              result = p.RotateMatrixWith90DegreeInHour(matrix);
      18:              PrintMatrix(matrix5);
      19:              p.RotateMatrixWith90DegreeInPlace(ref matrix5);
      20:              PrintMatrix(matrix5);
      21:              int[,] t = (int[,])ResizeMultipleDimensionArray(matrix6, new int[] { 2,3});
      22:              PrintMatrix(t);
      23:              Console.ReadKey();
      24:          }
      25:   
      26:          /// <summary>
      27:          /// 第一种方法,很自然想到定义一个新的数组, 旋转后的元素存在新数组中
      28:          /// 该方法不受矩阵形状限制,可以是非方形矩阵
      29:          /// </summary>
      30:          public int[,] RotateMatrixWith90Degree(int[,] matrix)
      31:          {
      32:              int line = matrix.GetLength(0);
      33:              int column = matrix.GetLength(1);
      34:              if (line == 0 || column == 0)
      35:              {
      36:                  throw new ArgumentNullException("matrix is empty,either its line or column length is 0");
      37:              }
      38:   
      39:              int[,] newMatrix = new int[column, line];
      40:              for (int i = 0;i< line; i++)
      41:              {
      42:                  for (int j = 0; j < column; j++)
      43:                  {
      44:                      newMatrix[j, line-i-1] = matrix[i, j];
      45:                  }
      46:              }
      47:              return newMatrix;
      48:          }
      49:   
      50:          /// <summary>
      51:          /// 逆时针旋转90度
      52:          /// </summary>
      53:          public int[,] RotateMatrixWith90DegreeInHour(int[,] matrix)
      54:          {
      55:              int line = matrix.GetLength(0);
      56:              int column = matrix.GetLength(1);
      57:              if (line == 0 || column == 0)
      58:              {
      59:                  throw new ArgumentNullException("matrix is empty,either its line or column length is 0");
      60:              }
      61:   
      62:              int[,] newMatrix = new int[column, line];
      63:              for (int i = 0; i < line; i++)
      64:              {
      65:                  for (int j = 0; j < column; j++)
      66:                  {
      67:                      newMatrix[column-j-1, i] = matrix[i, j];
      68:                  }
      69:              }
      70:              return newMatrix;
      71:          }
      72:   
      73:          /// <summary>
      74:          /// in-place旋转
      75:          /// 假设条件:方形矩阵
      76:          /// </summary>
      77:          public void RotateMatrixWith90DegreeInPlace(ref int[,] matrix)
      78:          {
      79:              int line = matrix.GetLength(0);
      80:              int column = matrix.GetLength(1);
      81:              if (line == 0 || column == 0)
      82:              {
      83:                  throw new ArgumentNullException("matrix is empty,either its line or column length is 0");
      84:              }
      85:              else if(line!=column)
      86:              {
      87:                  throw new ArgumentException("matrix is not N*N");
      88:              }
      89:              for (int i = 0; i < line/2; i++)
      90:              {
      91:                  for (int j = i; j < line-1-i; j++)
      92:                  {
      93:                      int lefttop = matrix[i, j];
      94:                      matrix[i, j] = matrix[line - j - 1,i];
      95:                      matrix[line - j - 1, i] = matrix[line - i - 1, line - j - 1];
      96:                      matrix[line - i - 1, line - j - 1] = matrix[j, line - i - 1];
      97:                      matrix[j, line - i - 1] = lefttop;
      98:                  }
      99:              }
     100:          }
     101:   
     102:          public static Array ResizeMultipleDimensionArray(Array arr, int[] newSizes)
     103:          {
     104:              Array newArr=Array.CreateInstance(arr.GetType().GetElementType(), newSizes);
     105:              int length = arr.Length < newArr.Length ? arr.Length : newArr.Length;
     106:              Array.ConstrainedCopy(arr, 0, newArr, 0, length);
     107:              return newArr;
     108:          }
     109:   
     110:          /// <summary>
     111:          /// Print the matrix to console
     112:          /// </summary>
     113:          public static void PrintMatrix(int[,] matrix)
     114:          {
     115:              int line = matrix.GetLength(0);
     116:              int column = matrix.GetLength(1);
     117:              if (line == 0 || column == 0)
     118:              {
     119:                  Console.WriteLine("empty array!");
     120:              }
     121:              else
     122:              {
     123:                  Console.WriteLine("lines:" + line.ToString());
     124:                  Console.WriteLine("columns:" + column.ToString());
     125:              }
     126:              for (int i = 0; i < line; i++)
     127:              {
     128:                  Console.WriteLine();
     129:                  for (int j = 0; j < column; j++)
     130:                  {
     131:                      Console.Write(matrix[i, j].ToString().PadLeft(5));
     132:                      Console.Write(" ");
     133:                  }
     134:              }
     135:          }
     136:      }
  • 相关阅读:
    Python 进度条
    python多线程的使用
    Python 进程间通信问题—Manager方法
    生产消费者模型(进程通信,队列)
    进程锁 购票问题
    多进程并行实现socket并发代码
    一次完整的socket文件的传输
    python实现基本计算器(可处理括号和负值)
    模拟论坛登录
    JS
  • 原文地址:https://www.cnblogs.com/dancewithautomation/p/3509422.html
Copyright © 2011-2022 走看看