2015-08-16 14 views
-1

我正在嘗試執行hackerrank矩陣旋轉挑戰。我的代碼有一個我找不到的地方有一個錯誤。該代碼應該旋轉測試矩陣的所有外部和內部循環r次(1 < = r < = 10 E 9)。如果我不在r上執行模數,那麼代碼運行良好,除了在hackerrank服務器上超時的r值更高的值。如果我在r上做了一個模數,那麼這段代碼將會失敗r> =(r%number_of _elements_in_outer_loop)的測試用例。我找不到錯誤。在此先感謝您的回覆。以下是代碼(在Visual Studio 2015中測試)。與要求hackerrank挑戰是here有人可以在我的代碼中找到用於Matrix旋轉的錯誤嗎?

// MatrixRotation.cpp : Defines the entry point for the console application. 
// 

#include "stdafx.h" 
#include <iostream> 

using namespace std; 

int main() 
{ 
// int i, j, k; 
    int m, n, r; 
    int rotations, rot; 
    int m_start, m_end, m_len; 
    int n_start, n_end, n_len; 
    int m_curr, n_curr; 

//------------------------------------------------------------------------- 
// For hackerrank testing 
//------------------------------------------------------------------------- 

    int i, j; 

    for (i = 1; i <= 3; i++) 
    { 

     if (i == 1) std::cin >> m; 
     else if (i == 2) std::cin >> n; 
     else std::cin >> r; 

    } 

    int **matrix = new int*[m]; 
    for (int i = 0; i < m; ++i) { 
     matrix[i] = new int[n]; 
    } 

    for (i = 0; i < m; i++) 
     for (j = 0; j < n; j++) 
      std::cin >> matrix[i][j]; 


    //------------------------------------------------------------------------- 
    // For local machine in Visual Studio testing 
    //------------------------------------------------------------------------- 

    /* 

    int i, j, k; 

    m = 10; 
    n = 8; 
    r = 40; 

    int **matrix = new int*[m]; 
    for (int i = 0; i < m; ++i) { 
     matrix[i] = new int[n]; 
    } 

    k = 1; 
    for (i = 0; i < m; i++) 
     for (j = 0; j < n; j++) 
     { 
      matrix[i][j] = k; 
      k += 1; 
     } 

    for (i = 0; i < m; i++) 
     for (j = 0; j < n; j++) 
     { 
      std::cout << matrix[i][j] << " "; 

      if (j == n - 1) 
       std::cout << endl; 

     } 

    std::cout << endl; 

    */ 

    //------------------------------------------------------------------------- 
    // Begin computations 
    //------------------------------------------------------------------------- 

    int outer_loop_rotation; 

    outer_loop_rotation = (n - 1) + (m - 1) + (n - 1) + (m - 1) ; 

    rot = r % outer_loop_rotation; 

// std::cout << endl << endl << "outer loop rotation = " << outer_loop_rotation << endl << endl << "rot = " << rot << endl << endl; 

    for (rotations = 1; rotations <= rot; rotations++) 
    { 

     m_start = 0; 
     m_end = m - 1; 

     n_start = 0; 
     n_end = n - 1; 

     m_len = m_end - m_start; 
     n_len = n_end - n_start; 


     // Following while loop is 1 rotation for all loops 

     while (m_len >= 1 && n_len >= 1) 
     { 

      int loop_start = matrix[m_start][n_start]; 

      // Following for loop is for row start 

      m_curr = m_start; 
      n_curr = n_start; 

      for (i = 1; i <= n_len ; i++) 
      { 

       matrix[m_curr][n_curr] = matrix[m_curr][n_curr + 1]; 
       n_curr += 1; 

      } 

      // Following for loop is for col end 

      m_curr = m_start; 
      n_curr = n_end; 

      for (i = 1; i <= m_len ; i++) 
      { 

       matrix[m_curr][n_curr] = matrix[m_curr + 1][n_curr]; 
       m_curr += 1; 

      } 

      // Following for loop is for row end 

      m_curr = m_end; 
      n_curr = n_end; 

      for (i = 1; i <= n_len ; i++) 
      { 

       matrix[m_curr][n_curr] = matrix[m_curr][n_curr - 1]; 
       n_curr -= 1; 

      } 

      // Following for loop is for col start 

      m_curr = m_end; 
      n_curr = n_start; 

      for (i = 1; i <= m_len ; i++) 
      { 
       if (i < m_len) 
       { 
        matrix[m_curr][n_curr] = matrix[m_curr - 1][n_curr]; 
        m_curr -= 1; 


       } 

       else 
       { 

        matrix[m_curr][n_curr] = loop_start; 


       } 

      } 

      m_start += 1; 
      m_end -= 1; 

      n_start += 1; 
      n_end -= 1; 

      m_len = m_end - m_start; 
      n_len = n_end - n_start; 


     } // End while loop 

    } // End for loop 

    // End computations, now output to command line 

    for (i = 0; i < m; i++) 
     for (j = 0; j < n; j++) 
     { 
      std::cout << matrix[i][j] << " "; 

      if (j == n - 1) 
       std::cout << endl; 

     } 


    return 0; 
} 
+0

Hackerrank挑戰環節:https://www.hackerrank.com/challenges/matrix-rotation-algo/copy-from/13133234如果你在挑戰我的代碼運行,那麼你必須註釋掉的#include「 stdafx.h「在代碼的開頭。 – te7

+0

您應該將每個循環旋轉r個位置,或者在優化後,'r%number_of_positions_in_this_loop'位置。 –

回答

1

我認爲錯誤是,你是計算一個模量值僅僅一次對整個矩陣,對應於旋轉所述最外層的週期重複長度。但是,矩陣中的每個層將具有不同的週期長度。例如,最外層的重複週期長度,而你正在計算它,方法是:

(n - 1) + (m - 1) + (n - 1) + (m - 1) 

然而,對於第二到最外層,所述重複長度:

(n - 3) + (m - 3) + (n - 3) + (m - 3) 

或更一般

((n - ((layer*2)+1)) + (m - ((layer*2)+1))) * 2 

其中最外層是0,第二個到最外面的是1等

因此,您需要更改代碼來計算每層的模量而不是整個矩陣的一次。

+0

謝謝。這就是我想的,但我不確定。如果它有效,我會將你的答案標記爲已接受。 – te7

+0

謝謝。這工作。我不得不交換外部的「for」和「while」循環來使其工作。我會將你的答案標記爲可接受的解決方案。 – te7

1

下面是最終的代碼,以防萬一有興趣。

// MatrixRotation.cpp : Defines the entry point for the console application. 
    // 

#include "stdafx.h" 
#include <iostream> 

using namespace std; 

int main() 
{ 
// int i, j, k; 
    int m, n, r; 
    int rotations, rot; 
    int loop_decrement, loop_rotation; 
    int m_start, m_end, m_len; 
    int n_start, n_end, n_len; 
    int m_curr, n_curr; 

//------------------------------------------------------------------------- 
// For hackerrank testing 
//------------------------------------------------------------------------- 

    int i, j; 

    for (i = 1; i <= 3; i++) 
    { 

     if (i == 1) std::cin >> m; 
     else if (i == 2) std::cin >> n; 
     else std::cin >> r; 

    } 

    int **matrix = new int*[m]; 
    for (int i = 0; i < m; ++i) { 
     matrix[i] = new int[n]; 
    } 

    for (i = 0; i < m; i++) 
     for (j = 0; j < n; j++) 
      std::cin >> matrix[i][j]; 


    //------------------------------------------------------------------------- 
    // For local machine in Visual Studio testing 
    //------------------------------------------------------------------------- 

/* 

    int i, j, k; 

    m = 4; 
    n = 4; 
    r = 2; 

    int **matrix = new int*[m]; 
    for (int i = 0; i < m; ++i) { 
     matrix[i] = new int[n]; 
    } 

    k = 1; 
    for (i = 0; i < m; i++) 
     for (j = 0; j < n; j++) 
     { 
      matrix[i][j] = k; 
      k += 1; 
     } 

    for (i = 0; i < m; i++) 
     for (j = 0; j < n; j++) 
     { 
      std::cout << matrix[i][j] << " "; 

      if (j == n - 1) 
       std::cout << endl; 

     } 

    std::cout << endl; 

    */ 

    //------------------------------------------------------------------------- 
    // Begin computations 
    //------------------------------------------------------------------------- 

    m_start = 0; 
    m_end = m - 1; 

    n_start = 0; 
    n_end = n - 1; 

    m_len = m_end - m_start; 
    n_len = n_end - n_start; 


    // Following while loop is all rotations 
    // for all loops one loop at a time 

    loop_decrement = 1; 

    while (m_len >= 1 && n_len >= 1) 
    { 
     // loop_rotation = number of items in current loop 

     loop_rotation = (n - loop_decrement) + (m - loop_decrement) + (n - loop_decrement) + (m - loop_decrement); 

     rot = r % loop_rotation; 

     for (rotations = 1; rotations <= rot; rotations++) 
     { 

      int loop_start = matrix[m_start][n_start]; 

      // Following for loop is for top row in current loop 

      m_curr = m_start; 
      n_curr = n_start; 

      for (i = 1; i <= n_len ; i++) 
      { 

       matrix[m_curr][n_curr] = matrix[m_curr][n_curr + 1]; 
       n_curr += 1; 

      } 

      // Following for loop is for right col in current loop 

      m_curr = m_start; 
      n_curr = n_end; 

      for (i = 1; i <= m_len ; i++) 
      { 

       matrix[m_curr][n_curr] = matrix[m_curr + 1][n_curr]; 
       m_curr += 1; 

      } 

      // Following for loop is for bottom row in current loop 

      m_curr = m_end; 
      n_curr = n_end; 

      for (i = 1; i <= n_len ; i++) 
      { 

       matrix[m_curr][n_curr] = matrix[m_curr][n_curr - 1]; 
       n_curr -= 1; 

      } 

      // Following for loop is for left col in current loop 

      m_curr = m_end; 
      n_curr = n_start; 

      for (i = 1; i <= m_len ; i++) 
      { 
       if (i < m_len) 
       { 
        matrix[m_curr][n_curr] = matrix[m_curr - 1][n_curr]; 
        m_curr -= 1; 


       } 

       else 
       { 

        matrix[m_curr][n_curr] = loop_start; 


       } 

      } 

     } // End for loop 

     m_start += 1; 
     m_end -= 1; 

     n_start += 1; 
     n_end -= 1; 

     m_len = m_end - m_start; 
     n_len = n_end - n_start; 

     loop_decrement += 2; 

    } // End while loop 

    // End computations, now output to command line 

    for (i = 0; i < m; i++) 
     for (j = 0; j < n; j++) 
     { 
      std::cout << matrix[i][j] << " "; 

      if (j == n - 1) 
       std::cout << endl; 

     } 


    return 0; 
} 
相關問題