Advertisement
DacCum

Шахівниця

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