Форум программистов, компьютерный форум CyberForum.ru

Рекурсия: вычислить количество лесенок, которое можно построить из N кубиков - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Шаблонные функции http://www.cyberforum.ru/cpp-beginners/thread239312.html
Чет не получается написать шаблонную функцию. func.h template <class T> T strnstr (T str, T substr, unsigned int count) { T* str1; T* str2 = substr;
C++ Даны действительные числа 1. Даны действительные числа x, y, z Вычислить: а)max(x+y+z, xyz) б)min^2(x+y+z/2,xyz)+1 2) даны x,y,z. вычислить a,b если a=(1+y)*((x+y)/(x^2+4))/e^-x-2 + 1/(x^2+4) b=(1+cos(y-2))/x^4 / 2+sin^2 Z помогите решить пожалуйста. http://www.cyberforum.ru/cpp-beginners/thread239299.html
Visual C++ MFC Picture Control
как сделать что бы Picture Control появлялся только после нажатия кнопки ?
C++ Вычислить арифметическое выражение
пожалуйста помогите : Дано натуральное число n. Вычислить
C++ Задание с синусами и косинусами http://www.cyberforum.ru/cpp-beginners/thread239260.html
Две недели назад я выкладывал эту задачу на форуме. Мне помогли в ее решении, но решили неправильно. Сама задача такова: Вычислить S=cos1/sin1+(cos1+cos2/sin2+sin3)+...+(cos1+cos2+...+cosN)/(sinN+sin(n+1)+...+sin(2N-1). Вот что у меня получилось: #include <iostream> #include <math.h> using namespace std; int main() {
C++ помогите сделать пожалуйста, Вычислить и вывести на экран в виде таблицы значения функции, заданной с помощью ряда Тейлора, на интервале от X нач до Xконеч с шагом dX с точностью e" . r^(-x) = (сума с низу n=0 сверху ,бесконечность) ((-1)^n*x^n)/(n!) я незнаю как обозначается значок сумvы.... подробнее

Показать сообщение отдельно
Wanee
52 / 52 / 13
Регистрация: 02.02.2011
Сообщений: 428

Рекурсия: вычислить количество лесенок, которое можно построить из N кубиков - C++

07.02.2011, 12:34. Просмотров 904. Ответов 8
Метки (Все метки)

Здраствуйте! У меня есть одна классическая задачка про Лесенку.

Лесенка
Лесенкой называется набор кубиков, в котором каждый более верхний слой содержит кубиков меньше, чем предыдущий. Требуется написать программу, вычисляющую число лесенок, которое можно построить из N кубиков.

Входные данные
Во входном файле input.txt записано натуральное число N (1 ≤ N ≤ 225) – количество кубиков в лесенке.

Выходные данные
В выходной файл output.txt необходимо вывести число лесенок, которые можно построить из N кубиков.

Примеры
input.txt
3
output.txt
2

input.txt
6
output.txt
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
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
89
90
91
92
93
94
95
96
#include <fstream>
using namespace std;
 
short a[256][20];
short n, m = 0;
long x = 0;
 
short sum(short j)
{
    short s = 0;
    for(short i = 0; i < n; i++)
        s += a[i][j];
    return s;
}
short f()
{
    short s = 0;
    for(short j = 0; j < m; j++)
        s += sum(j);
    return s;
}
bool prov(short i, short j)
{
    bool z = true;
    for(short q = i; q < n; q++)
        if(a[q][j] == 1)
        {
            z = false;
            break;
        }
    return z;
}
void remiks(short j)
{
    for(short i = 0; i < n - 1; i++)
        if(a[i][j] == 2)
        {
            a[i][j] = 0;
            a[i + 1][j]++;
        }
    if(a[n][j] == 2)
    {
        a[n][j] = 0;
        a[0][j + 1]++;
    }
}
void main()
{
    ifstream f("input.txt");
    ofstream g("output.txt");
 
    f >> n;
 
    while(x < n)
    {
        m++;
        x += m;
        if(x > n)
            m--;
    }
 
    for(short j = 0; j < m; j++)
        for(short i = 0; i < n; i++)
            a[i][j] = 0;
 
    short p = m * n;
    bool z;
    x = 0;
 
    while(f() != p)
    {
        a[0][0]++;
 
        for(short j = 0; j < m; j++)
            remiks(j);
        if(f() == n)
        {
            z = true;
            for(short j = 0; j < m - 1; j++)
                if(sum(j) <= sum(j + 1))
                {
                    z = false;
                    break;
                }
            for(short j = 0; j < m; j++)
                if(prov(sum(j) + 1; j) == false)
                {
                    z = false;
                    break;
                }
            if(z == true)
                x++;
        }
    }
    g << x;
}
 Комментарий модератора 
Дублирование тем нарушает правила форума. Рекурсия, ошибка
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 00:12. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru