Vladislav_Bezruk

Untitled

Nov 14th, 2021 (edited)
229
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.07 KB | None | 0 0
  1. #include <iostream>
  2.  
  3. /*мінімальне значення для позначення якщо неможливо здійснити рух вгору, вправо або по діагоналі*/
  4. #define C -9999
  5.  
  6. /*
  7. 2 -1 3 3 -2 -3 4 2
  8. -1 2 -2 -1 4 2 -3 2
  9. 2 -1 5 3 -1 2 -1 3
  10. 1 -2 5 3 3 -2 -4 6
  11. -2 4 -2 3 -5 1 -3 -4
  12. -3 -2 -1 -5 3 1 -3 -2
  13. -2 -3 -2 3 -2 3 -1 -5
  14. 3 -1 -2 -3 -2 -1 4 5
  15. */
  16.  
  17. using namespace std;
  18.  
  19. int main() {
  20.    
  21.     /*n - розмір масиву*/
  22.     /*u, r, d - значення для визначення максимального*/
  23.    
  24.     int n, u, r, d;
  25.    
  26.     cout << "Enter n: ";
  27.     cin >> n;
  28.     cout << endl;
  29.    
  30.     int map[n][n], maxMap[n][n];
  31.    
  32.     /*map - масив значень*/
  33.     /*maxMap - масив максимальних значень*/
  34.    
  35.     for (int i = 0; i < n; i++)
  36.         for (int j = 0; j < n; j++)
  37.             cin >> map[i][j];
  38.    
  39.     /*ініціалізуємо кінцеву точку*/
  40.     maxMap[0][n - 1] = map[0][n - 1];
  41.    
  42.     /*обраховуємо максимальні значення*/
  43.     /*йдемо з кінцевої клітинки до початкової*/
  44.     for (int i = 0; i < n; i++) {
  45.         for (int j = n - 1; j >= 0; j--) {
  46.             if (not (i == 0 && j == n - 1)) {
  47.                 u = r = d = C;
  48.                
  49.                 /*якщо можливий рух вгору*/
  50.                 if (i - 1 >= 0) {
  51.                     u = maxMap[i - 1][j];  
  52.                 }
  53.                
  54.                 /*якщо можливий рух вправо*/
  55.                 if (j + 1 < n) {
  56.                     r = maxMap[i][j + 1];  
  57.                 }  
  58.                
  59.                 /*якщо можливий рух по діагоналі*/
  60.                 if (j + 1 < n && i - 1 >= 0) {
  61.                     d = maxMap[i - 1][j + 1];  
  62.                 }
  63.                
  64.                 /*записуємо максимальне значення*/
  65.                 maxMap[i][j] = map[i][j] + max(u, max(r, d));
  66.             }
  67.         }
  68.     }
  69.    
  70.     /*йдемо з першої клітинки до кінцевої*/
  71.     int i = n - 1, j = 0;
  72.    
  73.     cout << endl << "Way: ";
  74.    
  75.     /*доки теперішня клітина != кінцевій*/
  76.     while (not (i == 0 && j == n - 1)) {
  77.         u = r = d = C;
  78.        
  79.         /*якщо можливий рух вгору*/
  80.         if (i - 1 >= 0) {
  81.             u = maxMap[i - 1][j];  
  82.         }
  83.        
  84.         /*якщо можливий рух вправо*/
  85.         if (j + 1 < n) {
  86.             r = maxMap[i][j + 1];  
  87.         }  
  88.        
  89.         /*якщо можливий рух по діагоналі*/
  90.         if (j + 1 < n && i - 1 >= 0) {
  91.             d = maxMap[i - 1][j + 1];  
  92.         }
  93.        
  94.         /*рухаємось вгору якщо це max*/
  95.         if (u == max(u, max(r, d))) {
  96.             cout << "U";
  97.             i--;   
  98.         }
  99.        
  100.         /*рухаємось вправо якщо це max*/
  101.         if (r == max(u, max(r, d))) {
  102.             cout << "R";
  103.             j++;   
  104.         }
  105.        
  106.         /*рухаємось по діагоналі якщо це max*/
  107.         if (d == max(u, max(r, d))) {
  108.             cout << "D";
  109.             i--; j++;  
  110.         }
  111.     }
  112.    
  113.     cout << endl << "Max score: " << maxMap[n - 1][0] << endl;
  114.     cout << endl << "Map of max values:" << endl;
  115.    
  116.     for (int i = 0; i < n; i++) {
  117.         for (int j = 0; j < n; j++)
  118.             cout << maxMap[i][j] << " ";
  119.         cout << endl;
  120.     }  
  121.    
  122.     return 0;
  123. }
Add Comment
Please, Sign In to add comment