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

Дилемма заключённого - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Какие цифры числа больше? http://www.cyberforum.ru/cpp-beginners/thread639065.html
Здравствуйте, я перехожу плавно с Pascal на С++, и решаю задачку на С++, но столкнулся с проблемой сдачи задачи, на С++ код не проходит и выдает "неправильный" ответ, а тот же самый код на паскале проходит и засчитан! Поясните в что не так, что исправить? var n,s,d:integer; begin readln(n); s:=n div 100; d:=n mod 10; if s>d then writeln(s) else if s<d then
C++ Удаление элемента списка list.STL Всем привет! Ребята, не могу понять почему у меня не получается удалить конкретный элемент списка. Вот код void WriteClientinFile( Client &client, int &position ) { list < Client > :: iterator iteratorclient; iteratorclient = listclient.begin() + position; listclient.erase( iteratorclient ); listclient.push_back ( client ); http://www.cyberforum.ru/cpp-beginners/thread639012.html
C++ Скомпилируйте пожалуйста код (C++)
Вот код,можете скомпилировать его в exe файл,а то у меня не получается( #include <iostream> #include <sstream> using namespace std; int main()
C++ Встретил незнакомые операторы, нужно больше информации
Здравствуйте, встретил в одном из уроков такой пример: bool t = false; t = a > b; cout << a << (t==true ? " > " : " <= ") << b; Что это за операторы ? и : ? Первый раз их вижу, хотя не первый день изучаю с++. Нагуглил, что это условный оператор сравнения ?:, но инфы недостаточно.
C++ Проверьте пожалуйста код (C++) http://www.cyberforum.ru/cpp-beginners/thread638943.html
Вот я сам написал код(!)) Можете проверить: main() { printf("Content-type:text/html\n\n");
C++ почему часть текста исчезает ? переменная char и цикл вот скрипт , которая пишет текст сверху вниз . но часть текста исчезает . я так понял , переменная может внести в себя весь текст , так как если вписать в блакнот саму переменную , то текст будет полностью там , слева направо . а если работать с каждым символом отдельно , писать их сверху вниз , то часть текста исчезает . в чем проблема ? #include <iostream> using namespace std; main() {... подробнее

Показать сообщение отдельно
Thirteen
 Аватар для Thirteen
32 / 32 / 4
Регистрация: 04.07.2012
Сообщений: 50
17.08.2012, 19:16     Дилемма заключённого
Оригинал здесь:
http://ru.wikipedia.org/wiki/%D0%9F%...BD%D1%8B%D1%85
Собственно дилемма:
Поймали двух злодеев, которые совершили одно и то же преступление. Есть подозрения, что они действовали по сговору, а это уже более тяжёлая статья. Так что их начинают допрашивать, изолировав друг от друга. Каждому заключённому предлагают сделку: сдаёшь напарника - освобождаем тебя, а он получает 10 лет. Если ты молчишь и он молчит - получаете по полгода. Если оба друг друга сдаёте - получаете по два года. И вот они сидят и думают, как им поступить.

Повторяющаяся дилемма заключённого:
Вот здесь уже поинтереснее. Заключённые подставляют своих напарников (или не подставляют), а потом им объявляют результат, после чего круг повторяется, но уже с учётом предыдущих событий. В результате побеждает заключённый, набравший наименьшее количество лет.
Пишем программу:
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
#include <iostream>
#include <stdlib.h>
#include <time.h>
#include "PrisonerOne.h"
#include "PrisonerTwo.h"
 
#define LENGTH 1000 //Количество итераций
 
using namespace std;
 
int main()
{
    //Дилемма заключённого:
    //Поймали двух преступников, допрашивают каждого по отдельности
    //Если первый доносит на второго, а второй молчит, то второй получает 10 лет, первого освобождают
    //Если второй доносит на первого, то в точности наоборот.
    //Если оба молчат, то оба получают год. Вообще, в оригинальной формулировке - полгода. Но хочется использовать целые.
    //Наконец, если оба доносят, оба получают два года.
    //Табличку нарисуем:
    //------------------------------------------------------------------------------
    //|                      |   Заключённый Б молчит   |   Заключённый Б стучит   |
    //------------------------------------------------------------------------------
    //| Заключённый А молчит |     Оба получают год     | А - 10 лет, Б - свободен |
    //------------------------------------------------------------------------------
    //| Заключённый А стучит | Б - 10 лет, А - свободен |  Оба получают два года   |
    //------------------------------------------------------------------------------
    //Итак. Сначала оба заключённых будут случайно генерировать стучать или молчать. Для затравки. Потом будут какие-то более интеллектуальные алгоритмы.
    unsigned short int OneYears = 0; //Сколько лет получает игрок 1
    unsigned short int TwoYears = 0; //Сколько лет получает игрок 2
    int Result = 0; //Результат. Некоторые стратегии используют результат предыдущего хода. Значения: 0 - начало, 1 - оба молчат, 2 - А предал Б, 3 - Б предал А, 4 - оба сдают друг друга.
    for(int Round = 0; Round < LENGTH; Round++)
    {
        cout << endl << "Round #" << Round << endl;
        int OneBetray = PrisonerOne(Result);
        int TwoBetray = PrisonerTwo(Result);
        //Дальше проверяем, что получилось:
        if(OneBetray == 0 && TwoBetray == 0) //Если оба молчали
        {
            //Увеличим срок у обоих на год
            OneYears += 1;
            TwoYears += 1;
            Result = 1;
            cout << "Both of them keeped silence" << endl << "So that, both of them get a year of prison" << endl;
        }
        if(OneBetray == 1 && TwoBetray == 0) //Если первый предал второго, а второй молчал
        {
            //У второго увеличиваем срок на 10 лет
            TwoYears += 10;
            Result = 2;
            cout << "Prisoner two have been betrayed by his companion" << endl << "So, prisoner two get 10 years, while another prisoner enjoys his freedom" << endl;
        }
        if(OneBetray == 0 && TwoBetray == 1) //Если второй предал первого, а первый молчал
        {
            //У первого увеличиваем срок на 10 лет
            OneYears += 10;
            Result = 3;
            cout << "Prisoner two have betrayed another prisoner" << endl << "His is such an asshole! But he is free asshole! And his friend is in prison for 10 years" << endl;
        }
        if(OneBetray == 1 && TwoBetray == 1) //Если оба донесли друг на друга
        {
            //У обоих увеличиваем срок на 2 года
            OneYears += 2;
            TwoYears += 2;
            Result = 4;
            cout << "They have betrayed each other" << endl << "So, two years is enough for both of them" << endl;
        }
        cout << "Score:" << endl;
        cout << "Player One: " << OneYears << endl;
        cout << "Player Two: " << TwoYears << endl;
    }
    return 0;
}
Где PrisonerOne.h и PrisonerTwo.h - заголовочные файлы с "искусственным интеллектом".
Вики вещает, что лучшая стратегия - Око за око. То есть, первым ходом молчишь, потом отвечаешь тем же, что тебе сделали на предыдущем ходе. Она у меня реализована за PrisonerTwo (файл в аттаче).
В общем, чего я от вас, собственно, хочу. Стратегий. Пишем в PrisonerOne.h и PrisonerTwo.h функцию ИИ, которая принимает один аргумент - результат предыдущего хода, и выносит своё решение, основываясь на этом аргументе (ну или как-то ещё, монетку там подбрасывает, не суть).

Как-то длинновато получилось и не совсем в раздел для начинающих, но суть, я думаю, понятна.
Вложения
Тип файла: 7z Prisoners Dilemma.7z (736.0 Кб, 34 просмотров)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 20:04. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru