@gridex

Как нарисовать дерево, выбирая направление ветвей?

Всем привет. Необходимо написать программу на c++, в которой пользователь вводит цифру от 1 до 3. 1 - означает, что ветвь дерева будет "расти" в лево, 2 - в право, 3 - конец выполнения программы, в начале должен стоять "ствол". Соответственно, выглядеть должно примерно так:
spoiler
Все символы: \/, |
Сначала выводится ствол:
 |
Пользователь вводит, к примеру, 1:
\/
 |
Снова 1:
\/ 
 \/ 
  |
Теперь 2:
  \/ 
\/ 
 \/ 
  |
И 1:
 \/   
   \/ 
 \/ 
   \/ 
    |


Вот примерно так. Может, объяснил не совсем понятно, но на примере видно, что должно выйти. Если и не написать код, то хотя бы описать словами, как можно реализовать это или, может, ссылку на такую задачу, если она является типовой.
  • Вопрос задан
  • 141 просмотр
Решения вопроса 1
Sergomen
@Sergomen
Просто делай добро и оно вернётся
Вотъ)
61b92980cc4d2102149926.png
#include <iostream>
#include <vector>
using namespace std;

int main(){
    string v = "\\/", s = " |"; // v - ветка, s - ствол
    vector <string> all; // все дерево
    int q; // запрос цифры
   	int prevQ; // предыдущий запрос
    int posV = 0, posS = 0, posA = 0; // позиция ветки, ствола, ветки+ствола
    int step = 2; // шаг изменения позиции
    string spacesV = "", spacesS = ""; // пробелы ветки, ствола
    while(true){ // цикл повторяется бесконечно
    	cin >> q; // спрашиваем цифру у пользователя
    	if (q == 1){ // если цыфра 1
    		if (prevQ == 2)  // если предыдущая цыфра была 2
    			posV--; // уменьшаем позицию ветки на 1
			posV -= step; // уменшаем позицию ветки steр (в этом случае на 2 )
    		posS+=step; // увеличиваем на step позицию ствола
    		prevQ = 1; // записываем что эта цифра была 1
    	}
    	if (q == 2){ // если цифра 2
    		if (prevQ == 1) // если предыдщая цифра была 1
    			posV++; // увеличиваем позицию ветки на 1
    		posV += step; // увеличиваем позицию ветки на step
    		prevQ = 2; // записываем что это была цифра 2
    	}
    	if (q == 3) // если цифра 3
    		break; // выходим из цикла
    	system("cls"); // очистка экрана
		spacesV = ""; // пробелы перед веткой очищаются
		spacesS = ""; // и перед стволом тоже
    	for(int i = 0; i < posS + posV; i++) // цикл который увеличивает количество 
    		spacesV +=" "; // пробелов ветки на posS+posV
    	for(int i = 0; i < posS; i++) // цикл что увеличивет количество 
    		spacesS +=" "; // пробелов ствола на posS
    	
    	all.push_back(spacesV + v); // добавляем в вектор пробелы веток + ветку
    	if(q == 1) // если цифра 1
			for(int i = 0; i < all.size(); i++) // каждому элементу масива веток
				all[i] = "  " + all[i]; // добавляем два пробела

    	for(int i = all.size()-1; i >= 0; i--) // выводим в обратном порядке
			cout << all[i] << endl; // все элементы массива
    	cout << spacesS << s << endl; // выводим пробелы ствола и сам ствол
    }
	return 0;
}

если надо то могу полностю объяснить.
p.s. спасибо за идею для лабы)
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы