Задача про рыцарей и оруженосцев

258
11 декабря 2017, 15:56

Здравствуйте. Значит, задача состоит в том, чтобы переправить 3 рыцарей и 3 их оруженосцев на другой берег на лодке, в которую вмещается 2 человека. При этом каждый оруженосец не может находится в компании других рыцарей. Проблема в моем коде в том, что, благодаря моему чудесному алгоритму, я перевожу на другой берег только первых 1 или 2 рыцарей/оруженосцев не смотря на то, кто с кем в паре, и из-за этого часто получается, что какой-то оруженосец остается без своего рыцаря :)

#include <iostream>
#include <windows.h>
using namespace std;
class game {
public:
    int counto, i;
    char left[6], right[6];
    int knights, pages;
    bool isOnRightSide;
    int knightsOnLeftSide, pagesOnLeftSide;
    int knightsOnRightSide, pagesOnRightSide;
    game() {
        counto = 1;
        knightsOnLeftSide = pagesOnLeftSide = 3;
        knightsOnRightSide = pagesOnRightSide = 0;
        isOnRightSide = false;
        for (i = 0; i<3; i++) {
            left[i] = 'Л';
            left[i + 3] = 'з';
            right[i] = ' ';
            right[i + 3] = ' ';
        }
    }
    void get() {
    start:
        cout << "\nСкільки лицарів переправити?\n";
        cin >> knights;
        getchar();
        cout << "\nСкільки зброєносців переправити?\n";
        cin >> pages;
        getchar();
    if (knights>3 || pages>3 || knights<0 || pages<0)
        goto start;
    else if ((knights + pages)>2 || (knights + pages == 0))
        goto start;
}
void display() {
    cout << "\nЛіва сторона\tПрава сторона\n";
    for (i = 0; i<3; i++)
        cout << left[i] << " ";
    cout << "\t\t";
    for (i = 0; i<3; i++)
        cout << right[i] << " ";
    cout << endl;
    for (i = 3; i<6; i++)
        cout << left[i] << " ";
    if (counto % 2 == 0) {
        isOnRightSide = true;
        cout << "\t    |__|";
    }
    else {
        isOnRightSide = false;
        cout << "|__|\t    ";
    }
    for (i = 3; i<6; i++)
        cout << right[i] << " ";
    cout << endl;
}
//Начало передвижения и проблемного кода
void moveToRightSide() {
    for (i = 0; i<knights; i++) {
        if (left[0] == 'Л') {
            left[0] = ' ';
            right[0] = 'Л';
            knightsOnLeftSide--;
            knightsOnRightSide++;
        }
        else if (left[1] == 'Л') {
            left[1] = ' ';
            right[1] = 'Л';
            knightsOnLeftSide--;
            knightsOnRightSide++;
        }
        else if (left[2] == 'Л') {
            left[2] = ' ';
            right[2] = 'Л';
            knightsOnLeftSide--;
            knightsOnRightSide++;
        }
    }
    for (i = 0; i<pages; i++) {
        if (left[3] == 'з') {
            left[3] = ' ';
            right[3] = 'з';
            pagesOnLeftSide--;
            pagesOnRightSide++;
        }
        else if (left[4] == 'з') {
            left[4] = ' ';
            right[4] = 'з';
            pagesOnLeftSide--;
            pagesOnRightSide++;
        }
        else if (left[5] == 'з') {
            left[5] = ' ';
            right[5] = 'з';
            pagesOnLeftSide--;
            pagesOnRightSide++;
        }
    }
}
void moveToLeftSide() {
    for (i = 0; i<knights; i++) {
        if (right[0] == 'Л') {
            right[0] = ' ';
            left[0] = 'Л';
            knightsOnLeftSide++;
            knightsOnRightSide--;
        }
        else if (right[1] == 'Л') {
            right[1] = ' ';
            left[1] = 'Л';
            knightsOnLeftSide++;
            knightsOnRightSide--;
        }
        else if (right[2] == 'Л') {
            right[2] = ' ';
            left[2] = 'Л';
            knightsOnLeftSide++;
            knightsOnRightSide--;
        }
    }
    for (i = 0; i<pages; i++) {
        if (right[3] == 'з') {
            right[3] = ' ';
            left[3] = 'з';
            pagesOnLeftSide++;
            pagesOnRightSide--;
        }
        else if (right[4] == 'з') {
            right[4] = ' ';
            left[4] = 'з';
            pagesOnLeftSide++;
            pagesOnRightSide--;
        }
        else if (right[5] == 'з') {
            right[5] = ' ';
            left[5] = 'з';
            pagesOnLeftSide++;
            pagesOnRightSide--;
        }
    }
}
//Конец передвижения и проблемного кода
bool isGameActive() {
    if (knightsOnLeftSide<pagesOnLeftSide && knightsOnLeftSide>0 || knightsOnRightSide<pagesOnRightSide && knightsOnRightSide>0) {
        system("cls");
        cout << "\n\n\tВи програли!\n";
        return false;
    }
    else if (pagesOnRightSide == knightsOnRightSide && pagesOnRightSide == 3 && knightsOnRightSide == 3) {
        system("cls");
        cout << "\n\n\tВи перемогли!\n";
        return false;
    }
    return true;
}
};
int main() {
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    game g;
    while (g.isGameActive()) {
        g.display();
        g.get();
        if (g.isOnRightSide == false)
            g.moveToRightSide();
        else
            g.moveToLeftSide();
        g.counto++;
    }
    getchar();
    return 0;
}

Прошу помощи только в минимизации кода и его поправки в двух функциях движения. Заранее спасибо.

READ ALSO
d3dx9: переопределение типа &ldquo;class&rdquo; C++

d3dx9: переопределение типа “class” C++

Что делать? Уже полтора часа голову ломаю :(

204
Определить номер заданного пользователем числа в файле

Определить номер заданного пользователем числа в файле

Задано текстовый файлОпределить номер заданного пользователем числа, если такого нет в строке, то сообщить об этом

238
Необработанное исключение по адресу 0x0F89D6F0 (ucrtbased.dll) в 111.exe: 0xC0000005: нарушение прав доступа при чтении по адресу 0x00000000

Необработанное исключение по адресу 0x0F89D6F0 (ucrtbased.dll) в 111.exe: 0xC0000005: нарушение прав доступа при чтении по адресу 0x00000000

Не могу понять что так с программой переделывал из инета код для построения графика функций вроде должна прога строить но выполняеться if и выводиться...

341
Помогите новичку с кодом для построения графика функции на VS (C++)

Помогите новичку с кодом для построения графика функции на VS (C++)

Доброго времени суток, изучаю на втором курсе С++, дали задание написать код программы для построения графика уравнения 2cosx-4,5x+076=0 интервалы(xn=0...

255