Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.69
Count
0 / 0 / 0
Регистрация: 06.11.2011
Сообщений: 24
#1

Ханойские башни, объясните принцип работы! - C++

24.02.2012, 08:23. Просмотров 1697. Ответов 2
Метки нет (Все метки)

Можете мне "расписать" все что происходит в этом коде, плюс отдельные вопросы в "комментариях", так что бы я сам смог это объяснить если меня спросят!

Начальный код:
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
// Ханойские башни
#include <iostream>
 
using namespace std;
 
void hanoi_towers(int quantity, int from, int to, int buf_peg)   //quantity-число колец, from-начальное положение колец(1-3),to-конечное положение колец(1-3)
{                                                         //buf_peg - промежуточный колышек(1-3)
        if (quantity != 0)
        {
                hanoi_towers(quantity-1, from, buf_peg, to);
 
                cout << from << " -> " << to << endl;
 
                hanoi_towers(quantity-1, buf_peg, to, from);
        }
}
 
int main()
{
        setlocale(LC_ALL,"rus");
        int start_peg, destination_peg, buffer_peg, plate_quantity;
        cout << "Номер первого столбика:" << endl;
        cin  >> start_peg;
        cout << "Номер конечного столбика:" << endl;
        cin  >> destination_peg;
        cout << "Номер промежуточного столбика:" << endl;
        cin  >> buffer_peg;
        cout << "Количество дисков:" << endl;
        cin  >> plate_quantity;
 
        hanoi_towers(plate_quantity, start_peg, destination_peg, buffer_peg);
return 0;
}
код с вопросами:

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
#include <iostream>
 
using namespace std;
 
void hanoi_towers(int quantity, int from, int to, int buf_peg)   //хотелось бы подробно узнать о том что происходит здесь, ка и каким образом это все пишется в void?  Что такое int from и int to, и чем оно является и их так сказать "тип" (включая int quantity и  int buf_peg)
{                                                         
        if (quantity != 0)
        {
                hanoi_towers(quantity-1, from, buf_peg, to); // Объясните что происходит внутри этих фигурных скобок? 
 
                cout << from << " -> " << to << endl;
 
                hanoi_towers(quantity-1, buf_peg, to, from);
        }
}
 
int main()
{
        setlocale(LC_ALL,"rus");
        int start_peg, destination_peg, buffer_peg, plate_quantity;// Тут задаются переменные с помощью которых все будет выводится на экран?
        cout << "Номер первого столбика:" << endl;
        cin  >> start_peg;
        cout << "Номер конечного столбика:" << endl;
        cin  >> destination_peg;
        cout << "Номер промежуточного столбика:" << endl;
        cin  >> buffer_peg;
        cout << "Количество дисков:" << endl;
        cin  >> plate_quantity;
 
        hanoi_towers(plate_quantity, start_peg, destination_peg, buffer_peg); // Что происходит здесь? 
return 0;
}
Добавлено через 13 часов 31 минуту
Заранее спасибо!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.02.2012, 08:23
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Ханойские башни, объясните принцип работы! (C++):

Объясните, пожалуйста, принцип работы. - C++
Есть прога, считает сумму ряда, но ряд - знакочередующийся (-1,1,-1,...). При подсчете программа заканчивае работу на 1023 члене. Но чем...

объясните принцип работы цикла : ? - C++
объясните принцип работы цикла : ?

Объясните принцип работы программы - C++
Добрый день ( вечер ). Мне дано было задание: Определить класс, объектами которого являются многоугольники указанного типа. ...

Объясните принцип работы программы - C++
//--------------------------------------------------------------------------- #include &lt;vcl.h&gt; #pragma hdrstop #include &lt;conio.h&gt; ...

Объясните пожалуйста принцип работы указателей - C++
#include &lt;iostream&gt; using namespace std; int main() { int *p,num; p = &amp;num; *p=100;

Односвязные списки. Объясните принцип работы. - C++
обьясните плзз как раотает односвязный список

2
Mikola-BLR
53 / 57 / 13
Регистрация: 27.12.2011
Сообщений: 93
25.02.2012, 03:45 #2
Ханойская башня является одной из популярных головоломок XIX века. Даны три стержня, на один из которых нанизаны N колец, причем кольца отличаются размером и лежат меньшее на большем. Задача состоит в том, чтобы перенести пирамиду из N колец за наименьшее число ходов. За один раз разрешается переносить только одно кольцо, причём нельзя класть большее кольцо на меньшее.
Количество перекладываний в зависимости от количества колец вычисляется по формуле 2^n − 1 (т.е. большое число дисков не вводите, т.к. решение потребует кучу времени).
В информатике задачи, основанные на легенде о Ханойской башне, часто рассматривают в качестве примера использования рекурсивных алгоритмов и преобразования их к не рекурсивным.
Рекурсия — процесс повторения чего-либо самоподобным способом (в данной программе функция hanoi_towers вызывает саму себя, вновь вызванная hanoi_towers вызывает саму себя и т.д.)
Тип void -пустой, т.к. hanoi_towers не возвращает в main никаких значений, она лишь печатает текст типа
1 -> 2
1 -> 3
2 -> 1
и т.д. Это наши ходы, показывающие с какого стержня на какой мы перекладываем диск.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int main()//отсюда начинается выполнение программы
{
        setlocale(LC_ALL,"rus");//вывод кириллицы не кракозябрами
        int start_peg, destination_peg, buffer_peg, plate_quantity;//Объявление переменных. Мы сообщаем, что будем использовать 4 переменных целочисленного типа. Под них выделяется память.
        cout << "Номер первого столбика:" << endl;
        cin  >> start_peg;//Инициализация переменной. С клавиатуры вводим значение и присваиваем его переменной start_peg (номер начального столбика)
        cout << "Номер конечного столбика:" << endl;
        cin  >> destination_peg;//С клавиатуры вводим значение и присваиваем его destination_peg
        cout << "Номер промежуточного столбика:" << endl;
        cin  >> buffer_peg;//С клавиатуры вводим значение и присваиваем его buffer_peg
        cout << "Количество дисков:" << endl;
        cin  >> plate_quantity;//С клавиатуры вводим значение и присваиваем его plate_quantity
 
        hanoi_towers(plate_quantity, start_peg, destination_peg, buffer_peg); //вызываем функцию hanoi_towers и передаём ей параметры plate_quantity(Количество дисков), start_peg(Номер первого столбика), destination_peg(Номер конечного столбика), buffer_peg(Номер промежуточного столбика)
return 0;
Сама функция описана выше main(), но начинает работать лишь тогда, когда мы её вызвали из main()
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void hanoi_towers(int quantity, int from, int to, int buf_peg)/*мы только что из main() прислали сюда 4 переменных и в теле этой функции
новым переменным целочисленного типа quantity, from, to, buf_peg присваиваем присланные значения переменных
plate_quantity, start_peg, destination_peg, buffer_peg.
quantity(количество дисков), from(Номер первого столбика), to(номер последнего), buf_peg(номер среднего)*/
{                                                         
        if (quantity != 0)//пока кол-во дисков не равно 0
        {
                hanoi_towers(quantity-1, from, buf_peg, to);/*рекурсия, т.е. мы снова вызываем эту же функцию и передаём ей 4 переменных, но количество дисков уже уменьшаем на один.
                Чуть ниже второй вызов, но там, обратите внимание, переменные передаются в другом порядке, т.е. там мы перекладываем диски на другие столбцы*/
 
                cout << from << " -> " << to << endl;//выводим текстовое сообщение, которое нам показывает с какого на какой столбик мы переложили диск
 
                hanoi_towers(quantity-1, buf_peg, to, from);
        }
}
каким образом это все пишется в void
"Это всё", а точнее наши 4 значения переменных, которые мы пересылаем из функции в функцию и потихоньку меняем, в void не пишутся. Они "пишутся" в quantity, from, to, buf_peg, которые создаются каждый раз во вновь вызванной функции. void - это тип значения, которое возвращает сама функция hanoi_towers по завершении. Но она выводит только текст и ничего не возвращает, поэтому используется пустой тип void.
2
comalex90
7 / 7 / 1
Регистрация: 28.01.2011
Сообщений: 33
25.02.2012, 16:27 #3
Может не в тему ,но посмотри
http://www.youtube.com/watch?v=vrVJNPMjBDA
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.02.2012, 16:27
Привет! Вот еще темы с ответами:

Ханойские башни - C++
Ребята, помогите разобраться с алгоритмом, то что сначала перемещаются n-1 дисков на вспомогательный стержень, затем n-ый нижний диск на...

Ханойские башни - C++
Головоломка “Ханойские башни” состоит из трех стержней, пронумерованных числами 1, 2, 3. На стержень 1 надета пирамидка из n дисков ...

Ханойские башни - C++
Решил задачу о ханойских башнях рекурсивно: void HanBashR(int count, int start, int mid, int final){ if(count == 2){ cout &lt;&lt;...

Ханойские башни - C++
У Дейтлов есть задача: Не могу до конца сформулировать алгоритм. Предположим, я беру 3 колышка и 4 диска int k1, k2, k3;...


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

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

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