Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.89/92: Рейтинг темы: голосов - 92, средняя оценка - 4.89
0 / 0 / 0
Регистрация: 20.04.2010
Сообщений: 23
1

C++ нарисовать елочку с символов

24.06.2010, 22:20. Показов 18589. Ответов 29
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Задача E. Елочка
«Нарисуйте» с помощью символов лес. При этом не пользуйтесь командами перемещения курсора по экрану. Ваша программа должна последовательно выводить символы строк (или строки целиком).
Лес — это одна или несколько елочек. Каждая елочка характеризуется количеством треугольников в ней и размером самого маленького треугольника. Елочка состоит из треугольников, у которых вершины находятся строго друг под другом, и каждый следующий треугольник содержит на одну строку больше предыдущего.
Все елочки должны по вертикали начинаться с первой строки. Каждая елочка должна быть расположена как можно левее, при этом елочки не должны соприкасаться (т.е. возле символов елочки справа, слева, снизу, сверху, а также по диагонали не должно быть символов, изображающих другую елочку), и не должен нарушаться порядок следования елочек.
Елочки должны изображаться символами «#» (решеточка), а пустые места между ними — символами «.» (точка). Во всех строках должно быть выведено одинаковое количество символов, при этом обязательно должна быть строка, в которой последним символом является решеточка, в последней строке обязательно должны быть решеточки (т.е. должен быть выведен прямоугольник из точек и решеточек, в нем не должно быть лишних столбцов и строк).
Входные данные. Вводится число елочек N, а дальше N пар натуральных чисел, описывающих елочки: первое число каждой пары задает количество треугольников в елочке, второе — размер самого маленького треугольника. Елочки описываются в порядке слева направо (если смотреть на вершины елочек).
Гарантируется, что входные данные будут таковы, что количество символов, которое нужно будет вывести в одной строке, не превысит 79.
Выходные данные. Выведите требуемый «рисунок». Для лучшего понимания смотрите примеры.
Пример ввода Пример вывода
2
3 2
3 3
...#......#....
..###....###...
...#....#####..
..###.....#....
.#####...###...
...#....#####..
..###..#######.
. #####....#....
#######..###...
... .....#####..
...... .#######.
..... .#########
3
1 1
2 1
3 2

#.#...#...
..#..###..
.###..#...
.....###..
....#####.
......#...
.....###..
....#####.
...#######

чтото типа того
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
24.06.2010, 22:20
Ответы с готовыми решениями:

Написать программу, которая будет выводить елочку из символов
Нужно написать программу которая будет выводить елочку из символов ^ ^ ^^^ ^^^^^ по...

Нарисовать елочку
помогите пожалуйста, нарисовать елочку. заранее спасибо.

Нарисовать ёлочку
15. Необходимо срочно к Новому году нарисовать ёлочку. С клавиатуры вводится количество ярусов, и...

Нарисовать елочку
Завтра зачет, нужно сделать программу с помощью вложенный циклов вывести елочку х хх х хх ххх...

29
21 / 20 / 3
Регистрация: 21.06.2010
Сообщений: 80
24.06.2010, 22:27 2
Цитата Сообщение от Yulia_3 Посмотреть сообщение
Для лучшего понимания смотрите примеры
Форматирование слетело, нефига не понятно
0
29 / 29 / 4
Регистрация: 08.06.2010
Сообщений: 146
24.06.2010, 22:28 3
TrenAr, опередил, только сказать хотел))
0
Эксперт С++
476 / 444 / 34
Регистрация: 20.11.2009
Сообщений: 1,293
24.06.2010, 22:31 4
Нарекаю тебя сиплюсплюсом.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
2
3 2
3 3
...#......#....
..###....###...
...#....#####..
..###.....#....
.#####...###...
...#....#####..
..###..#######.
. #####....#....
#######..###...
... .....#####..
...... .#######.
..... .#########
3
1 1
2 1
3 2
 
#.#...#...
..#..###..
.###..#...
.....###..
....#####.
......#...
.....###..
....#####.
...#######
Они еще и зелеными получились! Круто!
0
29 / 29 / 4
Регистрация: 08.06.2010
Сообщений: 146
24.06.2010, 22:34 5
Действительно интересное мозгодробительное задание
0
0 / 0 / 0
Регистрация: 20.04.2010
Сообщений: 23
24.06.2010, 22:41  [ТС] 6
а код...какой?
0
21 / 20 / 3
Регистрация: 21.06.2010
Сообщений: 80
24.06.2010, 23:47 7
Не очень сложно, в принципе, но вот это условие доставляет:
Цитата Сообщение от Yulia_3 Посмотреть сообщение
Каждая елочка должна быть расположена как можно левее, при этом елочки не должны соприкасаться
0
0 / 0 / 0
Регистрация: 20.04.2010
Сообщений: 23
25.06.2010, 00:33  [ТС] 8
код на С++ можете написать, если не сложно....спасибо...
0
21 / 20 / 3
Регистрация: 21.06.2010
Сообщений: 80
25.06.2010, 00:53 9
На С не подойдёт?
0
Эксперт С++
476 / 444 / 34
Регистрация: 20.11.2009
Сообщений: 1,293
25.06.2010, 00:59 10
Подойдет.
0
21 / 20 / 3
Регистрация: 21.06.2010
Сообщений: 80
25.06.2010, 02:32 11
Без сдвига ёлок, на С:

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
#include <stdio.h>
 
#define ROWS 3
#define COLUMNS 2
 
short printFieldPart( short row, short tree, short dataF[ ROWS ][ COLUMNS ] );
 
int main()
{
    short data[ ROWS ][ COLUMNS ] = { {1, 1}, {2, 1}, {3, 2} };
    short i, j, fl;
    
    /* Just a test
    for ( i = 0 ; i <= 2 ; i++ )
        for ( j = 0 ; j <= 1 ; j++ )
            printf("%hd\t", data[ i ][ j ]);
    */
    
    i = 1;
    fl = 0;
    while ( fl == 0 )
    {
          fl = 1;
          
          for ( j = 0 ; j <= ROWS - 1 ; j++ )
              fl = printFieldPart( i, j, data );
          
          i++;
          printf("\n");         
    }
 
    
    return 0;
}
 
short printFieldPart( short row, short tree, short dataF[ ROWS ][ COLUMNS ])
{
      short brunches, width, tmp;
      short i, j;
      
      //Search max width
      tmp = dataF[ tree ][ 1 ];
      for ( i = 0 ; i < dataF[ tree ][ 0 ] - 1 ; i++ )
            tmp ++;
      width = ( ( tmp ) * 2 ) - 1;
      
      //Search current local row (= tmp)
      tmp = dataF[ tree ][ 1 ];
      i = 1;
      while ( ( tmp < row ) && ( i <= dataF[ tree ][ 0 ] ) )
      {
            tmp += dataF[ tree ][ 1 ] + i;
            i++;
      }
      i--;
      tmp -= dataF[ tree ][ 1 ] + i;
      i++;
      
      //Draw it
      if ( i <= dataF[ tree ][ 0 ] )
      {
           brunches = ( ( row - tmp ) * 2 ) - 1;
           for ( j = 0 ; j <= ( ( width - brunches ) / 2 ) - 1 ; j++ )
               printf(".");
           for ( j = 0 ; j <= brunches - 1 ; j++ )
               printf("#");
           for ( j = 0 ; j <= ( ( width - brunches ) / 2 ) - 1 ; j++ )
               printf(".");
           
           return 0;
      }
      else
      {
          for ( j = 0 ; j <= width - 1 ; j++ )
               printf(".");
          return 1;
      }
}
1
0 / 0 / 0
Регистрация: 20.04.2010
Сообщений: 23
25.06.2010, 09:33  [ТС] 12
подойдет на С++, даже нужно...но мне преподаватель сказал что нужно использовать деревья....помогите с кодом...подскажити хотябы за что зачепится можно...?

Добавлено через 3 минуты
что значит
#define ROWS 3
#define COLUMNS 2
?

Добавлено через 24 минуты
что это значит?

#define ROWS 3
#define COLUMNS 2
0
Эксперт С++
476 / 444 / 34
Регистрация: 20.11.2009
Сообщений: 1,293
25.06.2010, 09:37 13
Наслаждайтесь http://www.citforum.ru/program... _054.shtml.
0
232 / 102 / 6
Регистрация: 18.04.2010
Сообщений: 294
25.06.2010, 11:23 14
Цитата Сообщение от Yulia_3 Посмотреть сообщение
#define ROWS 3
const short ROWS = 3;
А, ну да, ссылка есть выше)

Цитата Сообщение от Yulia_3 Посмотреть сообщение
но мне преподаватель сказал что нужно использовать деревья
Деревья? Можно уточнить какие именно?) На ум приходят сначала елки))
0
21 / 20 / 3
Регистрация: 21.06.2010
Сообщений: 80
25.06.2010, 19:05 15
Цитата Сообщение от Yulia_3 Посмотреть сообщение
подойдет на С++, даже нужно...но мне преподаватель сказал что нужно использовать деревья....помогите с кодом...подскажити хотябы за что зачепится можно...?
Ппц. После решения оказалось задачу нужно всё-таки на С и при этом использовать деревья...
А слабо было сразу написать всю эту информацию в первом сообщении?
0
0 / 0 / 0
Регистрация: 30.11.2008
Сообщений: 3
06.11.2013, 20:05 16
Подскажите, пожалуйста, в чём будет заключаться алгоритм сдвига ёлок между собой?
0
1 / 1 / 0
Регистрация: 21.05.2020
Сообщений: 11
01.12.2020, 22:01 17
Что за говнокод, простите пожалуйста? Зачем используете short, rows, почему COLUMNS это uppercase? Вас прогать нормально не учили? Тем более это с а не c++
0
1 / 1 / 0
Регистрация: 21.05.2020
Сообщений: 11
02.01.2021, 12:43 18
В общем, есть код на плюсах, но на 8-м тесте происходит RE, скорее всего выход за границы вектора.
Если отдебагаете, буду благодарен.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
#pragma gcc optimize("Ofast,no-stack-protector,tune=native")
#pragma gcc optimize("sse,sse2,sse3,sse4,ssse3")
// #pragma gcc optimize("O3")
#pragma gcc optimize("abm,mmx,avx,avx2,unroll-loops,fast-math,section-anchors")
 
#include <bits/stdc++.h>
 
using namespace std;
 
#define vec vector
#define all(x) x.begin(), x.end()
#define deq deque
 
typedef long long ll;
 
// #define int long long
 
vec<vec<int>> ans;
 
bool next (int l, int a, int b) {
    vec<pair<int, int>> moves = {{1, 1}, {1, 0}, {1, -1}, {0, -1}, {-1, -1}, {-1, 0}, {-1, 1}, {0, 0}};
    for (int i = 0; i < a; i++) {
        for (int j = 0; j <= (i - 1) + b; j++) {
            for (int k = 0; k < 1 + j; k++) {
                int tmp = 0;
                for (auto& it : moves) {
                        if (l + (2 * (a - 1) + (b * 2 - 1)) / 2 - k + it.second >= 0 && l + (2 * (a - 1) + (b * 2 - 1)) / 2 - k + it.second < ans[0].size() && ((i - 1) + 2 * b) * i / 2 + j + it.first < ans.size() && ((i - 1) + 2 * b) * i / 2 + j + it.first >= 0) {
                            tmp += ans[((i - 1) + 2 * b) * i / 2 + j + it.first][l + (2 * (a - 1) + (b * 2 - 1)) / 2 - k + it.second];
                        }
                }
                if (tmp && ans.size()) return l >= ans[0].size();
            }
        }
    }
    return l >= 0;
}
 
void print (int l, int a, int b) {
    for (int i = 0; i < a; i++) {
        for (int j = 0; j <= (i - 1) + b; j++) {
            for (int k = 0; k < 1 + j; k++) {
                    ans[((i - 1) + 2 * b) * i / 2 + j][l + (2 * (a - 1) + (b * 2 - 1)) / 2 + k] = 1;
                    ans[((i - 1) + 2 * b) * i / 2 + j][l + (2 * (a - 1) + (b * 2 - 1)) / 2 - k] = 1;
            }
        }
    }
}
 
signed main()
{
  ios_base::sync_with_stdio(0);
  cin.tie(0);
    int n; cin >> n;
    if (!n) return 0;
    vec<pair<int, int>> v(n);
    for (auto& it : v) cin >> it.first >> it.second;
    int w = 0, h = 0;
    for (auto& it : v) w += (2 * (it.first - 1) + (it.second * 2 - 1));
    for (auto& it : v) h = max(h, ((it.first - 1) + 2 * it.second) * it.first / 2);
    int cnt = 0;
    for (auto& it : v) {
        // for (auto& it : ans) {
        //  for (auto& jt : it) {
        //      cout << (jt ? "#" : ".");
        //  }
        //  cout << endl;
        // }
        // cout << endl << endl;
        ans.resize(h, vec<int> (w, 0));
        // cout << endl << "cnt " << cnt << endl;
        if (cnt) {
            while (next(cnt, it.first, it.second)) cnt--;
            while (!next(cnt, it.first, it.second)) cnt++;
        }
        // cout << endl << "cnt " << cnt << endl;
        ans.resize(h, vec<int> (cnt + (2 * (it.first - 1) + (it.second * 2 - 1)), 0));
        // cout << endl << "cnt " << cnt << endl;
        print(cnt, it.first, it.second);
        cnt += (2 * (it.first - 1) + (it.second * 2 - 1));
    }
    ans.resize(h, vec<int> (cnt));
    for (int i = 0; i < h; i++) {
        for (int j = 0; j < cnt; j++) {
            cout << (ans[i][j] ? "#" : ".");
        }
        cout << endl;
    }
}
0
1709 / 1109 / 337
Регистрация: 25.01.2019
Сообщений: 2,910
02.01.2021, 13:27 19
Цитата Сообщение от Santa_Mike Посмотреть сообщение
Что за говнокод, простите пожалуйста? Зачем используете short, rows, почему COLUMNS это uppercase? Вас прогать нормально не учили? Тем более это с а не c++
Цитата Сообщение от Santa_Mike Посмотреть сообщение
В общем, есть код на плюсах, но на 8-м тесте происходит RE, скорее всего выход за границы вектора.
Если отдебагаете, буду благодарен.
Ты что, серьёзно?
Зачем дефайны заглавными и шорты непонятно?
А твоя простыня с ll и неработающая, значит, - верх совершенства?

Цитата Сообщение от Santa_Mike Посмотреть сообщение
C++
1
// #define int long long
- это вот просто вишенка.
0
фрилансер
5499 / 5095 / 1047
Регистрация: 11.10.2019
Сообщений: 13,346
02.01.2021, 13:37 20
я бы такую задачу решал так:

1) прямоугольный массив-экран
2) рендерим на этом экране объекты-ёлочки в нужных местах. Прямоугольник каждой отрендеренной ёлки запоминаем, чтобы знать, где нельзя ставить новую ёлку
3) распечатываем весь массив
0
02.01.2021, 13:37
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.01.2021, 13:37
Помогаю со студенческими работами здесь

Нарисовать елочку из треугольников
Напишите в паскале Abc прогу для елочки=)из треугольников и что бы был ствол у елочки(чем быстрее...

Графика. Нарисовать елочку
Надо нарисовать елочку в любом паскале с помощью программы для треугольника и лижбо это все...

Как нарисовать елочку
Народ как написать задачу чтоб она выводила на экран елочку????????????? не могу понять....

Нарисовать ёлочку через функции
Как через функции через канвас нарисовать ёлочку ?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru