Advertisement
noctual

Untitled

Oct 10th, 2021
285
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.03 KB | None | 0 0
  1. #include <iostream>
  2. #include <string>
  3. using namespace std;
  4.  
  5. #pragma comment(linker, "/STACK:104857600")
  6.  
  7. struct Node {
  8.     int field;
  9.     Node* bottom;
  10.     Node* right;
  11. };
  12.  
  13. void print_Tree(Node* p, int level)
  14. {
  15.     if (p)
  16.     {
  17.         print_Tree(p->bottom, level + 1);
  18.         for (int i = 0; i < level; i++) cout << "   ";
  19.         cout << p->field << endl;
  20.         print_Tree(p->right, level + 1);
  21.     }
  22. }
  23.  
  24. int getMax(Node* node, bool Max, int level, char &hod) {
  25.     if (node->bottom != NULL && node->right != NULL) {
  26.         int bottom = getMax(node->bottom, !Max, level+1, hod);
  27.         int right = getMax(node->right, !Max, level + 1, hod);
  28.         hod = (Max && (bottom > right)) || (!Max && (bottom < right)) ? 'D' : 'R';
  29.         //cout << string(level*3, '-') << node->field << ' ' << ((Max && (bottom > right)) || (!Max && (bottom < right)) ? bottom : right) + node->field << (Max ? " max" : " min") << '\n';
  30.         return ((Max && (bottom > right)) || (!Max && (bottom < right)) ? bottom : right) + node->field;
  31.     }
  32.     else {
  33.         if (node->bottom != NULL) {
  34.             int bottom = getMax(node->bottom, !Max, level + 1, hod);
  35.             //cout << string(level * 3, '-') << node->field << ' ' << bottom + node->field << ' ' << (Max ? " max" : " min") << '\n';
  36.             hod = 'D';
  37.             return bottom + node->field;
  38.         }
  39.         else if (node->right != NULL) {
  40.             int right = getMax(node->right, !Max, level + 1, hod);
  41.             hod = 'R';
  42.             //cout << string(level * 3, '-') << node->field << ' ' << right + node->field << (Max ? " max" : " min") << '\n';
  43.             return right + node->field;
  44.         }
  45.     }
  46.     //cout << string(level * 3, '-') << node->field  << ' ' << node->field << (Max ? " max" : " min") << '\n';
  47.     return node->field;
  48. }
  49.  
  50. int main() {
  51.     ios::sync_with_stdio(0);
  52.     cin.tie(0);
  53.  
  54.     int N, M;
  55.     cin >> N >> M;
  56.  
  57.     Node*** nodeMass = new Node**[N];
  58.     for (int i = 0; i < N; i++) {
  59.         nodeMass[i] = new Node * [M];
  60.         for (int j = 0; j < M; j++) {
  61.             nodeMass[i][j] = new Node;
  62.             cin >> nodeMass[i][j]->field;
  63.         }
  64.     }
  65.  
  66.     for (int i = 0; i < N; i++) {
  67.         for (int j = 0; j < M; j++) {
  68.             nodeMass[i][j]->bottom = i < N - 1 ? nodeMass[i + 1][j] : NULL;
  69.             nodeMass[i][j]->right = j < M - 1 ? nodeMass[i][j + 1] : NULL;
  70.         }
  71.     }
  72.  
  73.     // print_Tree(nodeMass[0][0], 0);
  74.  
  75.     Node* root = nodeMass[0][0];
  76.     int summ = 0;
  77.  
  78.     for (int i = 0; i < N + M - 2; i++) {
  79.         char hod = ' ';
  80.         if (i % 2 == 0) {
  81.             int max = getMax(root, true, 0, hod);
  82.             cout << summ + max << ' ' << hod << '\n';  
  83.         }
  84.         else {
  85.             cin >> hod;
  86.         }
  87.  
  88.         summ += root->field;
  89.  
  90.         switch (hod)
  91.         {
  92.         case 'D':
  93.             root = root->bottom;
  94.             break;
  95.         case 'R':
  96.             root = root->right;
  97.             break;
  98.         default:
  99.             break;
  100.         }
  101.     }
  102.  
  103.     return 0;
  104. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement