1 Востаннє редагувалося Joker (12.06.2015 20:03:17)

Тема: Ханойська вежа С++

Умова

Легенда каже, що десь в Ханое знаходиться храм. У ньому є наступна конструкція: у основі лежать 3 алмазові стрижні, на один із яких закріплено 64 золотих диска з отворами по середині. Найбільший стержень закріплений знизу, найменший - зверху. Диски можна перекладати за такими правилами:
1) За один хід можна взяти тільки один диск;
2) Заборонено класти більший диск на менший;
Керуючись цими правилами, жреці повинні перенести початкову піраміду з 1-стержня на третій. Коли це станеться - кінець світу.
Ми пропонуємо розв'язати цю задачу за допомогою рекурсії.

Коду поки немає, взагалі!

Але є мої думки.
https://cloclo14.cloud.mail.ru/weblink/thumb/xw1/HTVq/qW6BcHY1g?x-email=havdyak_misha1998%40mail.ru

Не бачу жодної закономірності, жодного виходу :(

2

Re: Ханойська вежа С++

https://en.wikipedia.org/wiki/Tower_of_Hanoi
Матан включно.
Блок-схема алго в русскіх:
https://upload.wikimedia.org/wikipedia/ … art.ru.svg

Подякували: Joker1

3

Re: Ханойська вежа С++

Ого, дякую, буду розбиратися у всьому тому.
Будуть питання я продовжу тут.

4

Re: Ханойська вежа С++

1-2 1-3 2-3 в циклі (менший на більший). Це працює.

5

Re: Ханойська вежа С++

Розв'язав. Для 3 наче працює. Але в умові 64 і я не дочекався кінця.

Прихований текст
// Ханойська вежа
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

int counter = 0;

void t(int r, int b, int e)
{
    int c;

    if (((b == 1) && (e == 2)) || ((b == 2) && (e == 1)))
        c = 3;
    else
        if (((b == 1) && (e == 3)) || ((b == 3) && (e == 1)))
            c = 2;
        else
            if (((b == 2) && (e == 3)) || ((b == 3) && (e == 2)))
                c = 1;

    if (r>1)
    {
        t(r - 1, b, c);
            cout << b << " --> " << e << endl;
            counter++;
        t(r - 1, c, e);
    }
    else {
        cout << b << " --> " << e << endl;
        counter++;
    }
}

int main()
{
    system("color A");

    t(64, 1, 3);

    cout << "\n" << "Counter = " << counter << endl;

    system("pause");
    return 0;
}

глобальну змінну додав у останню секунду. Надалі її там не буде :)

6

Re: Ханойська вежа С++

Joker, чому Ви не називаєте змінні, імена функцій нормальними іменами?
Ваш код ніби після обфускатора.

7

Re: Ханойська вежа С++

Сам не знаю відповіді :)
Навіть не задумувався над цим.

P.S. Дякую за зауваження.

Re: Ханойська вежа С++

pere ( n:sht ;  gl1: i ;  gl2: i; gl3: i )
{    if ( n<1 ) return else print ( gl1, gl2)
;    pere     ( n-1; 1;3; 2 )
;    pere     ( 1; 1; 2;3)
;    pere     (n-1; 3;2;1)
;}

main()
{  pere ( 10; 1;2;3) ;}

Близько приблизно півроку тому, мій знайомий друг,
професор математики, показав мені псевдокод. він так
і пояснив, що всі мови програмування нього в голові переплуталися,
але це сама суть завдання.
Тримай ласка.