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

Ханойская башня - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 24, средняя оценка - 4.96
nurbol
-38 / 0 / 0
Регистрация: 19.05.2010
Сообщений: 45
01.06.2011, 14:50     Ханойская башня #1
23. Написать программу, которая печатает последовательность действий (в виде «перенести диск с q на r», где q и r – это А,В или С), решающую указанную задачу для n дисков, где n- заданное натуральное число. (При правильном переносе n дисков с А на С обязательно встретится конфигурация, показанная на рис.6,б).
Программу надо составить при помощи функции!
Миниатюры
Ханойская башня  
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.06.2011, 14:50     Ханойская башня
Посмотрите здесь:

C++ Ханойская башня
Ханойская башня C++
Ханойская башня еще раз C++
Ханойская башня C++
Ханойская башня- тесты C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
asics
Freelance
Эксперт C++
 Аватар для asics
2838 / 1775 / 144
Регистрация: 09.09.2010
Сообщений: 3,842
01.06.2011, 15:04     Ханойская башня #2
http://www.youtube.com/watch?v=bwxEcpmtHA4
BUMER
 Аватар для BUMER
157 / 12 / 0
Регистрация: 01.04.2009
Сообщений: 103
01.06.2011, 15:15     Ханойская башня #3
Реализуется через структуры и списки. Рекурсивная функция присутствует.
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
97
98
99
100
101
#include <conio.h>
#include <stdio.h>
 
struct usel
{
    int key;
    usel *next;
};
struct sp
{
    usel *head;
    int n;
    void push(int k)
    {
        usel *p;
        p=new usel;
        p->key=k;
        p->next=head->next;
        head->next=p;
        n++;
    }
    int pop()
    {
        usel *p; int k;
        if(empty()) return -1;
        p=head->next;
        head->next=p->next;
        k=p->key;
        delete p;
        n--;
        return k;
    }
    bool empty()
    {
        if(head->next) return false;
        return true;
    }
    void print()
    {
        usel *p;
        if(head->next)
        {
            p=head->next;
            while(p->next)
            {
                printf("%d ", p->key);
                p=p->next;
            }
            printf("%d ", p->key);
        }
    }
    sp()            //конструктор
    {
        head=new usel;
        head->next=0;
        n=0;
    } 
};
 
void vyvod_bashni(sp *tower)            //на каждом шаге выводит состояние всех башен
{
    int i;
    for(i=0;i<3;i++)
    {
        printf("%d bashnja: ", i+1);
        tower[i].print();
        printf("\n");
    }
    printf("\n");
}
 
void hanoy(sp *tower, int n, int from, int to, int help)
{
    int i;
    if(n==1) tower[to].push(tower[from].pop());
    else
    {
        hanoy(tower,n-1,from,help,to);
        vyvod_bashni(tower);
        hanoy(tower,1,from,to,help);
        vyvod_bashni(tower);
        hanoy(tower,n-1,help,to,from);
    }
}
 
void main()
{
    sp tower[3]; int i, a, j, n;
    printf("Vvedite vysotu bashen: "); scanf("%d", &n);
    printf("Vvedite elementy I bashni: ");
    for(j=0;j<n;j++)
    {
        scanf("%d", &a);
        tower[0].push(a);
    }
    printf("\n");
    vyvod_bashni(tower);
    hanoy(tower,n,0,2,1);
    vyvod_bashni(tower);
    getch();
}
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
01.06.2011, 15:26     Ханойская башня #4
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Зачем так извращаться... Можно сделать проще
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
void Hanoi(int n, char from, char to, char temp){ //n - число колец, from - имя стержня-источника, to - имя стержня-приемника, temp - имя временного стержня
  if(n>0){
    Hanoi(n-1, from, temp, to);
    std::cout << from << "->" << to << std::endl;
    Hanoi(n-1, temp, to, from);
  }
}
int main(){ //например
    Hanoi(3,'A','B','C');  
    return 0;
}
//Вывод:
//A->B
//A->C
//B->C
//A->B
//C->A
//C->B
//A->B
А вообще учимся гуглить
BUMER
 Аватар для BUMER
157 / 12 / 0
Регистрация: 01.04.2009
Сообщений: 103
01.06.2011, 15:48     Ханойская башня #5
diagon, да я не извращался, просто в прошлом семестре сдавали эту задачу, вот и выложил. Вообще тема у нас была "Реализация списков", поэтому код выглядит так заумно.
Yandex
Объявления
01.06.2011, 15:48     Ханойская башня
Ответ Создать тему
Опции темы

Текущее время: 08:48. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru