avr39ripe

cppRotate2DArrayEffective

Jul 23rd, 2021
1,214
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include <iostream>
  2.  
  3. int main()
  4. {
  5.     const int sizeY{ 5 };
  6.     const int sizeX{ 5 };
  7.     int arr2D[sizeY][sizeX]{
  8.         {1,2,3,4,5},
  9.         {6,7,8,9,10},
  10.         {11,12,13,14,15},
  11.         {16,17,18,19,20},
  12.         {21,22,23,24,25}
  13.     };
  14.     int copyElement;
  15.     char direction{ 'l' };
  16.     int shifts{ 0 };
  17.     int newHead{};
  18.  
  19.     while (true)
  20.     {
  21.         // output array
  22.         for (int y{ 0 }; y < sizeY; ++y)
  23.         {
  24.             for (int x{ 0 }; x < sizeX; ++x)
  25.             {
  26.                 std::cout << arr2D[y][x] << '\t';
  27.             }
  28.             std::cout << '\n';
  29.         }
  30.         std::cout << "Enter direction [l - left, r - right, u - up, d - down | x - exit]\n";
  31.         std::cin >> direction;
  32.         if (direction == 'x') { break; }
  33.  
  34.         std::cout << "Enter shifts count:\n";
  35.         std::cin >> shifts;
  36.         //fix shifts
  37.         direction == 'l' or direction == 'r' ? shifts %= sizeX : shifts %= sizeY;
  38.         newHead = shifts;
  39.         // get newHead index
  40.         if (direction == 'r') { newHead = sizeX - shifts; }
  41.         else if (direction == 'd') { newHead = sizeY - shifts; }
  42.  
  43.         if (direction == 'l' or direction == 'r')
  44.         {
  45.             for (int y{ 0 }; y < sizeY; ++y)
  46.             {
  47.                 int read{ newHead };
  48.                 int write{ 0 };
  49.                 int readNext{ 0 };
  50.                 int last{ sizeX };
  51.  
  52.                 while (write != read and read != last)
  53.                 {
  54.                     while (read != last)
  55.                     {
  56.                         if (write == readNext)
  57.                         {
  58.                             readNext = read;
  59.                         }
  60.  
  61.                         copyElement = arr2D[y][read];
  62.                         arr2D[y][read] = arr2D[y][write];
  63.                         arr2D[y][write] = copyElement;
  64.                         ++read;
  65.                         ++write;
  66.                     }
  67.                     read = readNext;
  68.                 }
  69.             }
  70.         }
  71.         else if (direction == 'u' or direction == 'd')
  72.         {
  73.             int read{ newHead };
  74.             int write{ 0 };
  75.             int readNext{ 0 };
  76.             int last{ sizeY };
  77.  
  78.             while (write != read and read != last)
  79.             {
  80.                 while (read != last)
  81.                 {
  82.                     if (write == readNext)
  83.                     {
  84.                         readNext = read;
  85.                     }
  86.                     for (int x{ 0 }; x < sizeX; ++x)
  87.                     {
  88.                         copyElement = arr2D[read][x];
  89.                         arr2D[read][x] = arr2D[write][x];
  90.                         arr2D[write][x] = copyElement;
  91.                     }
  92.                     ++read;
  93.                     ++write;
  94.                 }
  95.                 read = readNext;
  96.             }
  97.         }
  98.     }
  99.     return 0;
  100. }
RAW Paste Data