Форум программистов, компьютерный форум, киберфорум
Наши страницы
C++
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 2744, средняя оценка - 4.89
ForEveR
В астрале
Эксперт С++
7994 / 4753 / 651
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
#1

Задачи для тренировки и лучшего понимания - C++

15.07.2010, 05:53. Просмотров 361187. Ответов 1272
Метки нет (Все метки)

Ребят. Кто-нибудь может дать задачу для тренировки? Приблизительно по всему курсу С++. Буду благодарен за сложную задачу, но которую способен сделать новичок-любитель. Затраты сил-времени не важно. Главное, чтобы это было интересно и не слишком рутинно. + Если найдется человек который даст задачу просьба помогать с кодом, который я буду себя скидывать. Не переписывать за меня, но указывать на ошибки и желательно объяснять. Заранее спасибо.

Список задач, решение которых присутствует в данной теме:
43
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.07.2010, 05:53
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Задачи для тренировки и лучшего понимания (C++):

Прошу примеров для понимания INDY
Уважаемые коллеги и братья по интересу. Прошу примеров использования Indy UDP...

Ищу примеры для понимания взаимодействия Callback + event
Господа, подкиньте плиз какой-нибудь пример для понимания взаимодействия...

Элементарные программы, для лучшего понимания языка...
Здравствуйте. Вот сегодня решил что пора изучать с++. Есть пару задач. Начал...

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

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

Нужны простые задачи для тренировки
Добрый день всем:) Наверное подобных тем как я тут сотни,но всё же. Начал...

1272
Nameless One
Эксперт С++
5785 / 3434 / 351
Регистрация: 08.02.2010
Сообщений: 7,448
28.07.2010, 08:07 #241
GаlаX, 3 > 1, значит, нельзя
Можно ложить 1 на 2 и на 3, 2 на 3
0
nikkka
Мат в 32 хода
236 / 171 / 18
Регистрация: 10.09.2009
Сообщений: 1,096
28.07.2010, 08:20 #242
Цитата Сообщение от Aye Aye Посмотреть сообщение
Каждое перекладывание должно производиться через средний колышек
то есть в каждом ходе участвует средный колышек?
0
Mr.X
Эксперт С++
3178 / 1705 / 435
Регистрация: 03.05.2010
Сообщений: 3,867
28.07.2010, 09:38 #243
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
////////////////////////////////////////////////////////////////////////////////////////////
//Найдите кратчайшую последовательность перекладываний, перемещающих башню из n дисков 
//с левого колышка A на правый колышек C, если прямой обмен дисками между A и C запрещен. 
//(Каждое перекладывание должно производиться через средний колышек B. 
//Больший диск нельзя класть на меньший.)
////////////////////////////////////////////////////////////////////////////////////////////
#include <iostream>
#include <string>
 
 
typedef std::string  T_str;
 
T_str  get_Hanoi_tower_solution
    (
        int n, 
        char A, 
        char B,
        char C
    )
{    
    if(n == 1)
    {
        return T_str(1, A) + C + ' ';
    }
    else
    {
        return  get_Hanoi_tower_solution(n - 1, A, C, B) 
                + T_str(1, A) + C + ' '
                + get_Hanoi_tower_solution(n - 1, B, A, C);
    }
    
}
 
int main()
{
    std::locale::global(std::locale(""));
    std::cout << "Введите высоту башни: ";
    int n;
    std::cin >> n;
    std::cout << "Решение: "
              << std::endl;
    std::cout << get_Hanoi_tower_solution(n, 'A', 'B', 'C')
              << std::endl;   
    return 0;
}
Добавлено через 13 минут
Вообще-то вот так красивше будет:
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
////////////////////////////////////////////////////////////////////////////////////////////
//Найдите кратчайшую последовательность перекладываний, перемещающих башню из n дисков 
//с левого колышка A на правый колышек C, если прямой обмен дисками между A и C запрещен. 
//(Каждое перекладывание должно производиться через средний колышек B. 
//Больший диск нельзя класть на меньший.)
////////////////////////////////////////////////////////////////////////////////////////////
#include <iostream>
#include <string>
 
 
typedef std::string  T_str;
 
T_str  get_Hanoi_tower_solution
    (
        int n, 
        char A, 
        char B,
        char C
    )
{    
    if(n == 0)
    {
        return "";
    }
    else
    {
        return  get_Hanoi_tower_solution(n - 1, A, C, B) 
                + T_str(1, A) + C + ' '
                + get_Hanoi_tower_solution(n - 1, B, A, C);
    }
    
}
 
int main()
{
    std::locale::global(std::locale(""));
    std::cout << "Введите высоту башни: ";
    int n;
    std::cin >> n;
    std::cout << "Решение: "
              << std::endl;
    std::cout << get_Hanoi_tower_solution(n, 'A', 'B', 'C')
              << std::endl;   
    return 0;
}
2
nikkka
Мат в 32 хода
236 / 171 / 18
Регистрация: 10.09.2009
Сообщений: 1,096
28.07.2010, 13:27 #244
Итак. Давайте я пока выложу
Mr.X, это всё хорошо, но вы перекладыаете "кружки" непосредственно с A на С и с С на А, что запрещенно по условию задачки.
1
nikkka
Мат в 32 хода
236 / 171 / 18
Регистрация: 10.09.2009
Сообщений: 1,096
28.07.2010, 13:59 #245
Вот мат. часть задачки.
Цитата Сообщение от Aye Aye Посмотреть сообщение
привести математические обоснования
На данный момент я займусь изложением придуманной теории: как найти мин. количество ходов. Сначала я просто попробовал подсчитать, сколько нужно ходов для разных n. Вот что у меня получилось (n кол. "кружочков", k кол. ходов):
Код
n=1, k=2;
n=2, k=8;
n=3, k=26;
n=4, k=80;
По моему этого достаточно что бы заметить что новый k выражается по формуле 3(предыдущий k)+2. А теперь то что я "заметил", надо доказать. Итак. Допусти мы знаем, что для некого кол. "кружочков" n, есть мин. кол. ходов k. Каким оно будет для n+1? Начнем рассуждать. Что бы перенести (n+1)-ый кружочек с палочки А на палочку С, мы должны "преодолеть" палочку В. Для этого, мы должны перенести все остальные кружочки на палочку С, МИНИМАЛЬНЫМ количеством ходов. А оно (по условию) k. Итак, теперь мы знаем, что для n+1 кружочков, мин. кол. ходов для (n+1) кружочков будет k+... (дальше узнаем, чему равны эти "..."). Что мы имеем? Пирамидку из n кружочков на палочке С и (n+1)-ый кружочек на палочке А. Переносим его на палочку В. Теперь кол. мин. ходов для (n+1) кружочков = k+1+... . Далее, мы должны перенести (n+1)-ый кружочек на палочку С, для чего должны сначала освободить ее. Переносим пирамидку из n кружочков на палочку А, МИНИМАЛЬНЫМ кол. ходов. Мы знаем что оно = k. Теперь мин. кол. ходов для (n+1) кружочков = k+1+k... . Теперь, когда палочка С свободна, переносим на нее (n+1)-ный кружочек. Это уже k+1+k+1 ходов. А теперь перенесем пирамидку с А на С, где лежит наш (n+1)-ный кружок. А это уже k+1+k+1+k= 3k+2. А реализовать это рекурсией не сложно. Чем я сейчас и займусь...
0
Aye Aye
370 / 284 / 97
Регистрация: 17.12.2009
Сообщений: 567
28.07.2010, 14:02 #246
nikkka, да колышек B будет участвовать в каждом ходу.

Mr.X, к сожалению не правильно, nikkka все верно вроде бы.
0
nikkka
Мат в 32 хода
236 / 171 / 18
Регистрация: 10.09.2009
Сообщений: 1,096
28.07.2010, 14:04 #247
Aye Aye, а рассуждения хоть правельные? :S
0
Aye Aye
370 / 284 / 97
Регистрация: 17.12.2009
Сообщений: 567
28.07.2010, 14:12 #248
nikkka, я немного запутался в твоем обосновании )) вроде верно, сама идея по крайней мере верна, совет небольшой: надо написать формулу, а потом писать программу.
0
nikkka
Мат в 32 хода
236 / 171 / 18
Регистрация: 10.09.2009
Сообщений: 1,096
28.07.2010, 14:29 #249
Aye Aye, ну знаешь...
это теория. надо ДОКАЗАТЬ что Ваш алгоритм правелен, и что это ЕДИНСТВЕННЫЙ кратчайший путь. Это я и сделал. А саму программу я дописываю. Скоро скину.

Добавлено через 13 минут
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
#include <iostream>
#include <string.h>
#include <conio.h>
using namespace std;
string inverse(string s1)
{
    string s2=s1;
    int i=0;
    int size=0;
    while(s1[i]!='\0')
    {
        size++;
        i++;
    }
    i=0;
    while(s1[i]!='\0')
    {
        s2[i]=s1[size-i-1];
        i++;
    }
    return s2;
}
string theway(int n)
{
    string s1;
    if(n==1) s1="AB BC";
    if(n==2) s1="AB BC AB CB BA BC AB BC";
    if(n>2) s1=theway(n-1)+" AB "+inverse(theway(n-1))+" BC "+theway(n-1);
    return s1;
}
int main()
{
    cout<<theway(3);
    getch();
    return 0;
}
1
ForEveR
В астрале
Эксперт С++
7994 / 4753 / 651
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
28.07.2010, 14:39  [ТС] #250
nikkka, Красота! А я так и не додумался как сие сделать.
0
nikkka
Мат в 32 хода
236 / 171 / 18
Регистрация: 10.09.2009
Сообщений: 1,096
28.07.2010, 14:59 #251
Ещё задач!!!!!...
0
Хохол
Эксперт С++
475 / 443 / 34
Регистрация: 20.11.2009
Сообщений: 1,292
28.07.2010, 15:05 #252
nikkka, порешай тимус
1
nikkka
Мат в 32 хода
236 / 171 / 18
Регистрация: 10.09.2009
Сообщений: 1,096
28.07.2010, 15:22 #253
Хохол, извените, что порешать? : O
0
Хохол
Эксперт С++
475 / 443 / 34
Регистрация: 20.11.2009
Сообщений: 1,292
28.07.2010, 15:29 #254
acm.timus.ru
Вот выбрал легкую и прикольную задачу (только не залезай в обсуждение - сразу решение узнаешь)
http://acm.timus.ru/problem.aspx?space=1&num=1082
1
nikkka
Мат в 32 хода
236 / 171 / 18
Регистрация: 10.09.2009
Сообщений: 1,096
28.07.2010, 15:36 #255
Хохол, прочитал, но преревод дебильный... задачу понять не смог.

Не по теме:

зачем переводить задачки на англ.????

0
Nameless One
Эксперт С++
5785 / 3434 / 351
Регистрация: 08.02.2010
Сообщений: 7,448
28.07.2010, 15:47 #256
nikkka, там в левом верхнем углу можно язык переключить
1
nikkka
Мат в 32 хода
236 / 171 / 18
Регистрация: 10.09.2009
Сообщений: 1,096
28.07.2010, 15:49 #257
Nameless One, а, ну да...
0
Mr.X
Эксперт С++
3178 / 1705 / 435
Регистрация: 03.05.2010
Сообщений: 3,867
28.07.2010, 19:15 #258
Цитата Сообщение от nikkka Посмотреть сообщение
Итак. Давайте я пока выложу
Mr.X, это всё хорошо, но вы перекладыаете "кружки" непосредственно с A на С и с С на А, что запрещенно по условию задачки.
А, да, что-то я условия не дочитал. Тогда уж так полаконичнее:
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
////////////////////////////////////////////////////////////////////////////////////////////
//Найдите кратчайшую последовательность перекладываний, перемещающих башню из n дисков 
//с левого колышка A на правый колышек C, если прямой обмен дисками между A и C запрещен. 
//(Каждое перекладывание должно производиться через средний колышек B. 
//Больший диск нельзя класть на меньший.)
////////////////////////////////////////////////////////////////////////////////////////////
#include <iostream>
#include <string>
#include <algorithm>
////////////////////////////////////////////////////////////////////////////////////////////
typedef std::string  T_str;
////////////////////////////////////////////////////////////////////////////////////////////
T_str  get_tower_solution(int n)
{    
    if(n == 0)
    {
        return "";
    }
    else
    {
        T_str  sol_str = get_tower_solution(n - 1);
        T_str  sol_str_rev(sol_str);
        std::reverse_copy(sol_str.begin(), sol_str.end(), sol_str_rev.begin());
        return  sol_str + " AB " + sol_str_rev + " BC " + sol_str;                
    }    
}
////////////////////////////////////////////////////////////////////////////////////////////
int main()
{
    std::locale::global(std::locale(""));
    std::cout << "Введите высоту башни: ";
    int n;
    std::cin >> n;
    std::cout << "Решение: "
              << std::endl;
    std::cout << get_tower_solution(n)
              << std::endl;   
    return 0;
}
1
nikkka
Мат в 32 хода
236 / 171 / 18
Регистрация: 10.09.2009
Сообщений: 1,096
28.07.2010, 20:37 #259
Mr.X, есть функция котороя инверсирует строку?????
0
MikeSoft
Эксперт С++
3917 / 1782 / 183
Регистрация: 21.11.2009
Сообщений: 2,540
28.07.2010, 21:18 #260
nikkka, это глобальный вопрос? или по конкретной задаче?
Для реверса строки есть функция strrev
0
28.07.2010, 21:18
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.07.2010, 21:18
Привет! Вот еще темы с решениями:

Какая база требуется для понимания C++?
Доброго времени суток! Возникло желание научиться работать в Си, но одолели...

Какую литературу для первоначального понимания С++ нужно учить
Что первоначальное для понимания нужно учить и от куда лучше вычитывать? ...

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

Дайте задания для тренировки
День добрый. Учу C++. Я уверен, что тут есть люди которые с ним отлично...


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

Или воспользуйтесь поиском по форуму:
260
Закрытая тема Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru