3 семестр

This commit is contained in:
2022-05-14 15:22:55 +03:00
parent 64597ccc7e
commit b18d091370
35 changed files with 3547 additions and 0 deletions

281
Part1/Lab3/main.cpp Normal file
View File

@@ -0,0 +1,281 @@
#include <iostream>
#include <fstream>
using namespace std;
//<2F><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
class Node {
char d; //<2F><><EFBFBD> <20><><EFBFBD><EFBFBD>
Node* lft; // <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>
Node* rgt; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>
int count = 0;
public:
Node() : lft(nullptr), rgt(nullptr) { } // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
Node(const Node&) = delete;
Node& operator = (const Node&) = delete;
~Node() {
delete lft; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> (<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
delete rgt;
} // <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
friend class Tree; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
};
// <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
class Tree
{
Node* root; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
char num, maxnum; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>
int maxrow, offset; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>
char** SCREEN; // <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>
void clrscr() // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
for (int i = 0; i < maxrow; i++)
memset(SCREEN[i], '.', 80);
}
Node* MakeNode(int depth) // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
Node* v = nullptr;
int random;
random = rand() % 5 + 1;// cout << random << endl;
int Y = (depth < random) && (num <= '<EFBFBD>');
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: cout << "Node (" << num << ',' << depth << ")1/0: "; cin >> Y;
if (Y) { // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD> Y = 1
v = new Node;
v->lft = MakeNode(depth + 1);
v->d = num++; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
v->rgt = MakeNode(depth + 1);
}
return v;
}
void OutNodes(Node* v, int r, int c) // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> // root, 1, 40
{
if (r && c && (c < 80)) SCREEN[r - 1][c - 1] = v->d; // <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>
if (r < maxrow) {
if (v->lft) OutNodes(v->lft, r + 1, c -(offset >> r)); //<2F><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>
if (v->rgt) OutNodes(v->rgt, r + 1, c + (offset >> r)); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>
}
}
//Tree(const Tree&) = delete; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>
//Tree(Tree&&) = delete; // <20><><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (<28>++11)
//Tree& operator = (const Tree&) const = delete; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//Tree& operator = (Tree&&) const = delete; // <20><> <20><>, <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//
public:
Tree(char nm, char mnm, int mxr) :
num(nm), maxnum(mnm), maxrow(mxr), offset(40), root(nullptr),
SCREEN(new char* [maxrow])
{
for (int i = 0; i < maxrow; i++) SCREEN[i] = new char[80];
}
~Tree() {
for (int i = 0; i < maxrow; i++) delete[]SCREEN[i];
delete[]SCREEN; delete root;
}
void MakeTree() // <20><><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
root = MakeNode(0);
}
bool exist() { return root != nullptr; } // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void OutTree() // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>
{
clrscr();
OutNodes(root, 1, offset);
for (int i = 0; i < maxrow; i++)
{
SCREEN[i][79] = 0;
cout << '\n' << SCREEN[i];
}
cout << '\n';
}
int DFS() // <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
const int MaxS = 20; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>
int count = 0;
STACK <Node*> S(MaxS); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>
S.push(root); // STACK <- root
while (!S.empty()) // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>
{
Node* v = S.pop(); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>
cout << v->d << '_'; count++; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>, <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>
if (v->rgt) S.push(v->rgt); // STACK <- (<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>)
if (v->lft) S.push(v->lft); // STACK <- (<28><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>)
}
return count;
}
template <class Item>
class STACK
{
Item* S;
int t;
public:
STACK(int maxt)
{
S = new Item[maxt];
t = 0;
}
int empty() const
{
return t == 0;
}
void push(Item item)
{
S[t++] = item;
}
Item pop()
{
return (t ? S[--t] : 0);
}
};
int result()
{
int rezult = 0;
search_1(root, 1);
search_2(root, 1);
return counter(root, 1, &rezult);
}
void search_1(Node* v, int x) // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
while (x)
{
if (v->lft != nullptr)
{
v->count++;
search_1(v->lft,1);
if (v->rgt != nullptr)
{
v->count++;
search_1(v->rgt, 1);
x = 0;
}
x = 0;
}
if ((v->rgt == nullptr && v->lft == nullptr) || (v->count > 1))
{
x = 0;
break;
}
if (v->rgt != nullptr)
{
v->count++;
search_1(v->rgt, 1);
if (v->lft != nullptr)
{
v->count++;
search_1(v->lft, 1);
x = 0;
}
x = 0;
}
if (v->rgt == nullptr && v->lft == nullptr) x = 0;
}
}
void search_2(Node* v, int x) // <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
while (x)// //////
{
if (v->lft != nullptr)
{
v->count = v->count + v->lft->count;
search_2(v->lft, 1);
if (v->rgt != nullptr)
{
v->count = v->count + v->rgt->count;
search_2(v->rgt, 1);
x = 0;
}
x = 0;
}
if ((v->rgt == nullptr && v->lft == nullptr) || (v->count > 3))
{
x = 0;
break;
}
if (v->rgt != nullptr)
{
v->count = v->count + v->rgt->count;
search_2(v->rgt, 1);
if (v->lft != nullptr)
{
v->count = v->count + v->lft->count;
search_2(v->lft, 1);
x = 0;
}
x = 0;
}
if (v->rgt == nullptr && v->lft == nullptr) x = 0;
}
}
int counter(Node* v, int x, int* rezult)
{// <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD> 0 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>* (*<2A><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><> <20><><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
while (x)
{
if (v->count < 2)
{
(*rezult)++;
if (v->lft != nullptr)
{
counter(v->lft, 1, rezult);
x = 0;
}
if (v->rgt != nullptr)
{
counter(v->rgt, 1, rezult);
x = 0;
}
if (v->rgt == nullptr && v->lft == nullptr) x = 0;
}
else
{
if (v->lft != nullptr)
{
counter(v->lft, 1, rezult);
x = 0;
}
if (v->rgt != nullptr)
{
counter(v->rgt, 1, rezult);
x = 0;
}
if (v->rgt == nullptr && v->lft == nullptr) x = 0;
}
}
return *rezult;
}
};
//
int main ()
{
int n = 0, rezult;
setlocale(LC_ALL, "Russian");
srand(time(0));
Tree tr('<EFBFBD>','<EFBFBD>',5);
tr.MakeTree();
if (tr.exist())
{
tr.OutTree();
cout << '\n' << "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: ";
n = tr.DFS();
cout << " <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> = " << n << '\n';
rezult = tr.result();
cout << "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: " << rezult << '\n';
}
else
cout << "Error." << '\n';
}