Advertisement
MadCortez

Untitled

Apr 5th, 2021
363
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 8.08 KB | None | 0 0
  1. #define _CRT_SECURE_NO_WARNINGS
  2.  
  3. #include <iostream>
  4. #include <string>
  5. #include <fstream>
  6. #include <stdio.h>
  7. #include <string.h>
  8.  
  9. #define MIN_SIZE 0
  10. #define MAX_SIZE 20
  11. #define MAX_DEPTH 4
  12. #define OFFSET 20
  13. #define LEFT 0
  14. #define RIGHT 1
  15.  
  16. using namespace std;
  17.  
  18. struct Node {
  19.     int field;
  20.     Node* left;
  21.     Node* right;
  22. };
  23.  
  24. int childs[21];
  25. int maxPath = 0;
  26. int ansArr[21] = { 0 };
  27. short matrix[21][21];
  28.  
  29. int inputValue(int min, int max);
  30. int userInputFromConsole();
  31. Node* userInputFromFile();
  32. bool checkPath(string path);
  33. string userInputPath();
  34. short inputMethod();
  35. void printInConsole(string ans);
  36. string userOutputPath();
  37. void printInFile(string ans, string path);
  38. short outputMethod();
  39. void start();
  40. void printTask();
  41. Node* add(Node* tree, int n);
  42.  
  43. int inputValue(int min, int max) {
  44.     int currentValue;
  45.     bool isNotValid = true;
  46.     do {
  47.         cin >> currentValue;
  48.         if (currentValue >= min && currentValue <= max)
  49.             isNotValid = false;
  50.         else
  51.             cout << "Введите число в заданном диапазоне\n";
  52.     } while (isNotValid);
  53.     return currentValue;
  54. }
  55.  
  56. int userInputFromConsole() {
  57.     int n;
  58.     cout << "Введите вершину в диапазоне " << MIN_SIZE + 1 << ".." << MAX_SIZE << ", 0 - для окончания построения дерева" << ": ";
  59.     n = inputValue(MIN_SIZE, MAX_SIZE);
  60.     return n;
  61. }
  62.  
  63. Node* userInputFromFile() {
  64.     int n;
  65.     Node* tree = NULL;
  66.     string path = userInputPath();
  67.     ifstream file(path);
  68.     file.open(path);
  69.     file.clear();
  70.     while (!file.eof()) {
  71.         file >> n;
  72.         tree = add(tree, n);
  73.     }
  74.     file.close();
  75.     return tree;
  76. }
  77.  
  78. bool checkPath(string path) {
  79.     ifstream file(path);
  80.     if (file.is_open()) {
  81.         cout << path << " найден" << endl;
  82.         return true;
  83.     }
  84.     else {
  85.         cout << path << " не найден" << endl;
  86.         return false;
  87.     }
  88. }
  89.  
  90. string userInputPath() {
  91.     string path;
  92.     bool isNotValid = false;
  93.     do {
  94.         cout << "Введите абсолютный путь к файлу с входными данными" << endl;
  95.         cin >> path;
  96.     } while (!checkPath(path));
  97.     return path;
  98. }
  99.  
  100. short inputMethod() {
  101.     short method;
  102.     cout << "Каким способом хотите ввести данные?" << endl;
  103.     cout << "1 - с помощью консоли" << endl;
  104.     cout << "2 - с помощью файла" << endl;
  105.     do {
  106.         cin >> method;
  107.         if (method != 1 && method != 2)
  108.             cout << "Введите 1 или 2" << endl;
  109.     } while (method != 2 && method != 1);
  110.     return method;
  111. }
  112.  
  113. void printInConsole(string ans) {
  114.     cout << ans;
  115. }
  116.  
  117. string userOutputPath() {
  118.     string path;
  119.     cout << "Введите абсолютный путь к файлу для вывода результата" << endl;
  120.     cin >> path;
  121.     return path;
  122. }
  123.  
  124. void printInFile(string ans, string path) {
  125.     ofstream file(path);
  126.     file << ans;
  127.     cout << "Результат работы помещён в файл";
  128. }
  129.  
  130. short outputMethod() {
  131.     short method;
  132.     cout << "Куда хотите вывести результат?" << endl;
  133.     cout << "1 - в консоль" << endl;
  134.     cout << "2 - в файл" << endl;
  135.     do {
  136.         cin >> method;
  137.         if (method != 1 && method != 2)
  138.             cout << "Введите 1 или 2" << endl;
  139.     } while (method != 2 && method != 1);
  140.     return method;
  141. }
  142.  
  143. void printResult(string ans) {
  144.     short method = outputMethod();
  145.     if (method == 1)
  146.         printInConsole(ans);
  147.     else {
  148.         string path = userOutputPath();
  149.         printInFile(ans, path);
  150.     }
  151. }
  152.  
  153. short getTreeDepth(Node* tree) {
  154.     if (tree == NULL)
  155.         return 0;
  156.     else
  157.         return 1 + max(getTreeDepth(tree->left), getTreeDepth(tree->right));
  158. }
  159.  
  160. Node* add(Node* tree, int n) {
  161.     if (tree == NULL) {
  162.         Node* tree = new Node;
  163.         tree->field = n;
  164.         tree->left = NULL;
  165.         tree->right = NULL;
  166.         return tree;
  167.     }
  168.     else if (n < tree->field)
  169.         tree->left = add(tree->left, n);
  170.     else if (n > tree->field)
  171.         tree->right = add(tree->right, n);
  172.     else
  173.         cout << "Элемент " << n << " уже был добавлен в дерево" << endl;
  174.     return tree;
  175. }
  176.  
  177. int foo(short n) {
  178.     switch (n) {
  179.     case 1:
  180.         return 8;
  181.         break;
  182.     case 2:
  183.         return 4;
  184.         break;
  185.     case 3:
  186.         return 2;
  187.         break;
  188.     case 4:
  189.         return 0;
  190.         break;
  191.     default: return -1;
  192.     }
  193. }
  194.  
  195. void printTree(Node* tree, int currentSet, short depth, int index, char** str) {
  196.     if (!tree || depth < 1 || depth > MAX_DEPTH)
  197.         return;
  198.     int x = currentSet;
  199.     int z = foo(depth);
  200.     char* s = str[index];
  201.     s += currentSet - 1;
  202.     int a = sprintf(s, "%2d", tree->field);
  203.     s[2] = ' ';
  204.     currentSet--;
  205.     index++;
  206.     for (int j = 0; j < z; j++) {
  207.         s = str[index];
  208.         s += currentSet;
  209.         if (tree->left)
  210.             s[0] = '/';
  211.         s += (x - currentSet) * 2;
  212.         if (tree->right)
  213.             s[0] = '\\';
  214.         index++;
  215.         currentSet--;
  216.     }
  217.     printTree(tree->left, currentSet, depth + 1, index, str);
  218.     printTree(tree->right, (x + z + 1), depth + 1, index, str);
  219. }
  220.  
  221. void getTreeAsMatrix(Node* tree, short matrix[21][21]) {
  222.     if (tree->left) {
  223.         matrix[tree->field][tree->left->field] = 1;
  224.         matrix[tree->left->field][tree->field] = 1;
  225.         getTreeAsMatrix(tree->left, matrix);
  226.     }
  227.     if (tree->right) {
  228.         matrix[tree->field][tree->right->field] = 1;
  229.         matrix[tree->right->field][tree->field] = 1;
  230.         getTreeAsMatrix(tree->right, matrix);
  231.     }
  232. }
  233.  
  234. void getChilds(Node* tree, int childs[21]) {
  235.     if (tree->left)
  236.         childs[tree->field]++;
  237.     if (tree->right)
  238.         childs[tree->field]++;
  239.     if (tree->left)
  240.         getChilds(tree->left, childs);
  241.     if (tree->right)
  242.         getChilds(tree->right, childs);
  243. }
  244.  
  245. void DFS(int now, int path[21], int step, short child, int lengthPath, int visited[21]) {
  246.     if (visited[now] > 0)
  247.         return;
  248.     visited[now] = now;
  249.     path[step] = now;
  250.     if (childs[now] != child)
  251.         if (maxPath < lengthPath) {
  252.             maxPath = lengthPath;
  253.             for (int i = 1; i < lengthPath + 1; i++)
  254.                 ansArr[i] = path[i];
  255.         }
  256.     for (int i = 1; i < 21; i++)
  257.         if (i != now)
  258.             if (matrix[now][i] == 1)
  259.                 DFS(i, path, step + 1, child, lengthPath + 1, visited);
  260. }
  261.  
  262. void printTask() {
  263.     cout << "Деревья. Найти путь максимальной длины между вершинами с разным числом потомков." << endl;
  264. }
  265.  
  266. void start() {
  267.     printTask();
  268.     int n = 1;
  269.     Node* tree = NULL;
  270.     short method = inputMethod();
  271.     if (method == 1)
  272.         while ((n = userInputFromConsole()) != 0) {
  273.             tree = add(tree, n);
  274.         }
  275.     if (method == 2) {
  276.         tree = userInputFromFile();
  277.     }
  278.     char** str = new char*[64];
  279.     for (int i = 0; i < 64; i++) {
  280.         str[i] = new char[64];
  281.         memset(str[i], ' ', 64);
  282.         str[i][63] = 0;
  283.     }
  284.     printTree(tree, OFFSET, 1, 0, str);
  285.     int size = getTreeDepth(tree);
  286.     int j = size;
  287.     for (int i = 0; i < j; i++)
  288.         size += foo(i);
  289.     for (int i = 0; i < size + 1; i++)
  290.         cout << str[i] << endl;
  291.     for (int i = 0; i < 64; i++) {
  292.         delete(str[i]);
  293.     }
  294.     delete(str);
  295.  
  296.     getTreeAsMatrix(tree, matrix);
  297.     string ans = "";
  298.     int arr[21];
  299.     getChilds(tree, childs);
  300.     for (int i = 1; i < 21; i++) {
  301.         for (int j = 1; j < 21; j++) {
  302.             arr[j] = 0;
  303.         }
  304.         DFS(i, arr, 1, childs[i], 1, arr);
  305.     }
  306.     for (int i = 1; i < maxPath + 1; i++)
  307.         if (ansArr[i] != 0)
  308.             ans += to_string(ansArr[i]) + "->";
  309.     ans.erase(ans.size() - 2, 2);
  310.     printResult(ans);
  311. }
  312.  
  313. int main()
  314. {
  315.     setlocale(LC_ALL, "Russian");
  316.     start();
  317. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement