3 семестр
This commit is contained in:
281
Part1/Lab3/main.cpp
Normal file
281
Part1/Lab3/main.cpp
Normal 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';
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user