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

Написать алгоритм Иосифа Флавия, используя очередь - C++

Восстановить пароль Регистрация
 
w0nder
 Аватар для w0nder
0 / 0 / 0
Регистрация: 23.11.2012
Сообщений: 131
29.04.2013, 00:03     Написать алгоритм Иосифа Флавия, используя очередь #1
Сущ-т легенда что Иосиф Флавий выжил и стал известным благодоря математической одаренности. В ходе Иудейской войны он в составе отряда из 41 иудейского воина был загнан римлянами в пещеру. Предпочитая самоубийство в плену, воины решили выстроится в круг и последовательно убивать каждого 3го из живых до тех пор пока е останется ни одного человека. Однако Иосиф на ряду с 1 из единомышленников счел подобный конец бессмысленным - он быстро вычеслил места в круге на которые себя и товарища. И лишь поэтому остался жив.
Исключать k-го, пока не останется 1 человек. Определить номер уцелевшего.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.04.2013, 00:03     Написать алгоритм Иосифа Флавия, используя очередь
Посмотрите здесь:

C++ Задача Иосифа
C++ построить очередь, используя классы с конструкторами трех видов и деструктором
задача Иосифа Флавия / с помо щью циклического списка C++
C++ Задача Иосифа Флавия. Удалить каждый второй элемент из списка и в конце вывести на экран последний оставшийся элемент
C++ Надо написать программу на while или do while и написать алгоритм
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ternsip
 Аватар для Ternsip
660 / 188 / 6
Регистрация: 10.05.2012
Сообщений: 595
29.04.2013, 00:06     Написать алгоритм Иосифа Флавия, используя очередь #2
w0nder, напишите по-русски.
w0nder
 Аватар для w0nder
0 / 0 / 0
Регистрация: 23.11.2012
Сообщений: 131
29.04.2013, 00:10  [ТС]     Написать алгоритм Иосифа Флавия, используя очередь #3
Ternsip, как-то так, не я писала

Существует легенда, что Иосиф Флавий выжил и стал известным благодоря математической одаренности. В ходе Иудейской войны он в составе отряда из 41 иудейского воина был загнан римлянами в пещеру. Предпочитая самоубийство в плену, воины решили выстроиться в круг и последовательно убивать каждого 3-его из живых до тех пор, пока не останется ни одного человека.

Исключать k-го, пока не останется 1 человек. Определить номер уцелевшего.
Ternsip
 Аватар для Ternsip
660 / 188 / 6
Регистрация: 10.05.2012
Сообщений: 595
29.04.2013, 00:16     Написать алгоритм Иосифа Флавия, используя очередь #4
w0nder, а в чём проблема состоит ?
w0nder
 Аватар для w0nder
0 / 0 / 0
Регистрация: 23.11.2012
Сообщений: 131
29.04.2013, 00:18  [ТС]     Написать алгоритм Иосифа Флавия, используя очередь #5
Ternsip, в том, чтобы реализовать это, используя очередь
Ternsip
 Аватар для Ternsip
660 / 188 / 6
Регистрация: 10.05.2012
Сообщений: 595
29.04.2013, 00:22     Написать алгоритм Иосифа Флавия, используя очередь #6
w0nder, Вам повезло, у меня завалялся старый List (двунаправленная очередь) в моей реализации
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
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
template <typename E>
class Tlist{
public:
    struct list{
        E inf;
        list * next;
        list * prev;
    };
    //----
    list * head;
    list * tail;
    list * cur;
    //----
    list * init_list(){ 
        return NULL;
    };
    //----
    E pop_front(){
        list * r = head;
        E k = head->inf;
        if (head->next == NULL)
            head = tail = NULL;
        else {
            head = head->next;
            head->prev = NULL;
        };
        delete r;
        return k;
    };
    //----
    E pop_back(){
        list * r = tail;
        E k = tail->inf;
        if (tail->prev == NULL)
            head = tail = NULL;
        else {
            tail = tail->prev;
            tail->next = NULL;
        };
        delete r;
        return k;
    };
    //----
    void push_back(E key){
        list * r = new list;
        r->next = NULL;
        r->prev = NULL;
        r->inf = key;
        if(!head){
            head = r;
            tail = head;
        } else {
            r->prev = tail; 
            tail->next = r;
            tail = r;
        }
        cur = head;
    };
    //----
    E EraseRight(int x){
        list * r = cur;
        for (int i = 0; i < x; i++){ 
            if (r != tail){
                r = r->next;
            } else {
                r = head;
            };
        };
        int c = r->inf;
        if (r == head) {
            cur = head->next;
            return pop_front();
        };
        if (r == tail) {
            cur = head;
            return pop_back();
        };
        if (r != head && r != tail) {
            cur = r->next;
            r->prev->next = r->next;
            r->next->prev = r->prev;
            delete r;
        };
        return c;
    };
    //----
    E EraseLeft(int x){
        list * r = cur;
        for (int i = 0; i < x; i++){ 
            if (r != head){
                r = r->prev;
            } else {
                r = tail;
            };
        };
        int c = r->inf;
        if (r == head) {
            cur = tail;
            return pop_front();
        };
        if (r == tail) {
            cur = tail->prev;
            return pop_back();
        };
        if (r != head && r != tail) {
            cur = r->prev;
            r->prev->next = r->next;
            r->next->prev = r->prev;
            delete r;
        };
        return c;
    };
    //----
    Tlist(){
        head = tail = init_list();
        cur = head;
    };
};
Тут есть операция EraseLeft и Right в аргумент подаёте номер К, тем самым удаляете элемент, стоящий на позиции, которая получается путём перещагивания на k позиций от той, на которой вы остановились. Пихать в лист l.push(число); Объявление Tlist <int> l;
C++
1
2
printf("%d\n", l.EraseRight(t));
printf("%d\n", l.EraseLeft(-t));// если влево -- то с минусом
Yandex
Объявления
29.04.2013, 00:22     Написать алгоритм Иосифа Флавия, используя очередь
Ответ Создать тему
Опции темы

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