Advertisement
stefanpu

Submatrix with max sum

Feb 10th, 2013
81
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 5.02 KB | None | 0 0
  1. using System;
  2.  
  3. class MaxSumSquare
  4. {
  5.     static void PrintMatrix(int[,] matrix)
  6.     {
  7.         for (int row = 0; row < matrix.GetLength(0); row++)
  8.         {
  9.             for (int col = 0; col < matrix.GetLength(1); col++)
  10.             {
  11.                 Console.Write("{0,4}", matrix[row, col]);
  12.             }
  13.             Console.WriteLine();
  14.             Console.WriteLine();
  15.         }
  16.     }
  17.  
  18.     static void Main()
  19.     {
  20.         //Твоята матрица
  21.         int[,] firstTestMatrix = {
  22.             {7, 1, 3, 3, 2, 1},
  23.             {1, 3, 9, 8, 5, 6},
  24.             {4, 6, 7, 9, 1, 0} };
  25.  
  26.         //Още една примерна матрица
  27.         int[,] secondTestMatrix = {
  28.             {7, 1, 3, 3, 2, 1},
  29.             {1, 3, 9, 8, 5, 6},
  30.             {4, 6, 7, 9, 1, 0},
  31.             {9, 9, 9, 9, 9, 9} };
  32.  
  33.         //За да може автоматично да обходим двете тестови матрици
  34.         int[][,] allTestMatrises = {firstTestMatrix, secondTestMatrix };
  35.  
  36.         int[,] maxMatrix = new int[3, 3];      
  37.        
  38.  
  39.         foreach (var testMatrix in allTestMatrises)
  40.         {
  41.             int currentSum = 0;
  42.             int maxSum = int.MinValue;
  43.             int startRow = 0;
  44.             int startCol = 0;
  45.  
  46.             PrintMatrix(testMatrix);
  47.  
  48.             //Трябва да да добавиш още една итерация(използвайки "<=" вместо "<")
  49.             //в циклите обхождащи началната матрица, иначе кодът вътре не се изпълнява.
  50.             //При матрица с един от размерите равен на 3
  51.             for (int row = 0; row <= testMatrix.GetLength(0) - 3; row++)
  52.             {
  53.                 for (int col = 0; col <= secondTestMatrix.GetLength(1) - 3; col++)
  54.                 {
  55.                     //методът за сумиране - непроменен
  56.                     currentSum = SumElementsOfSubMatrix(testMatrix, row, col);
  57.  
  58.                     if (currentSum > maxSum)
  59.                     {
  60.                         //Всичко е наред тук
  61.                         maxSum = currentSum;
  62.                         startRow = row;
  63.                         startCol = col;
  64.  
  65.                         //Това е проблемната част от кода. Разгледай я.
  66.                         CopyMaxSumElements(maxMatrix, testMatrix, startRow, startCol);
  67.                     }
  68.                     currentSum = int.MinValue;
  69.                 }
  70.             }
  71.  
  72.             Console.WriteLine("The elements with maximal sum of the elements are: ");
  73.             PrintMatrix(maxMatrix);
  74.             Console.WriteLine();
  75.            
  76.         }
  77.        
  78.         //Тук също има грешка, не съм я гледал. Изпозлвах PrintMatrix за да ти
  79.         //покажа резултата
  80.         //Console.WriteLine("{0,4} {1,4} {2,4}", maxMatrix[startRow, startCol], maxMatrix[startRow, startCol + 1], maxMatrix[startRow, startCol + 2]);
  81.         //Console.WriteLine("{0,4} {1,4} {2,4}", maxMatrix[startRow + 1, startCol], maxMatrix[startRow + 1, startCol + 1], maxMatrix[startRow + 1, startCol + 2]);
  82.         //Console.WriteLine("{0,4} {1,4} {2,4}", maxMatrix[startRow + 2, startCol], maxMatrix[startRow + 2, startCol + 1], maxMatrix[startRow + 2, startCol + 2]);
  83.  
  84.        
  85.     }
  86.  
  87.     private static void CopyMaxSumElements
  88.         (int[,] maxMatrix, int[,] testMatrix, int startRow, int startCol)
  89.     {
  90.         //"Вътрешните цикли правилно започват от стартовите индекси за
  91.         //ред и колона на подматрицата с макс. сума
  92.         for (int i = startRow; i <= startRow + 2; i++)
  93.         {
  94.             for (int j = startCol; j <= startCol + 2; j++)
  95.             {
  96.                 //Този ред ти хвърля изключение, защото не ползваш
  97.                 //правилните индекси. За начална матрица [20,20];
  98.                 // и startRow =7, startCol=13 ще се опиташ да запишеш на
  99.                 // maxMatrix[7, 13.]                            
  100.                 //maxMatrix[i, j] = matrix[row, col];
  101.  
  102.                 //"Така започваш да записваш от позиция [0,0]
  103.                 //до позиция [2,2] в maxMatrix"
  104.                 maxMatrix[i - startRow, j - startCol] = testMatrix[i, j];
  105.             }
  106.         }
  107.     }
  108.  
  109.     private static int SumElementsOfSubMatrix
  110.         (int[,] testMatrix, int row, int col)
  111.     {
  112.        int currentSum = testMatrix[row, col] + testMatrix[row, col + 1] +
  113.             testMatrix[row, col + 2] + testMatrix[row + 1, col] +
  114.             testMatrix[row + 1, col + 1] + testMatrix[row + 1, col + 2] +
  115.             testMatrix[row + 2, col] + testMatrix[row + 2, col + 1] +
  116.             testMatrix[row + 2, col + 2];
  117.         return currentSum;
  118.     }
  119.  
  120. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement