Простые приложения на С++
November 20, 2023

Напёрстки

Азартная игра "Напёрстки" - это игра, в которой участники должны угадывать, в каком из нескольких напёрстков находится скрытый под ними предмет (обычно это шарик или монета). Игра в напёрстки обычно проводится между дилером (ведущим игры) и игроками. Дилер перемещает предметы между напёрстками, помешивая их, а затем участники делают ставки на выбор правильного напёрстка. Целью игры является угадать, под каким из напёрстков находится предмет. Игроки выбирают напёрсток, на который ставят свою ставку, и затем дилер поднимает выбранный напёрсток, чтобы показать, была ли ставка успешной. Если игрок угадывает правильный напёрсток, он выигрывает определенную сумму денег или призов. Игра в напёрстки является азартной из-за того, что участники основывают свои ставки на удаче и вероятности, не имея реального влияния на исход игры. Однако, в результате манипуляции дилера или использования ловушек, шансы на победу могут быть изменены в пользу дилера. Важно отметить, что игра в напёрстки может быть связана с риском потери денег, и она часто ассоциируется с играми на деньги или казино. Поэтому перед участием в азартной игре в напёрстки, важно быть осведомленным о своих финансовых возможностях и быть готовым к потенциальной потере.

Задача

Шулер показывает следующий трюк. Он имеет три одинаковых наперстка. Под первый (левый) он кладет маленький шарик. Затем он очень быстро выполняет ряд перемещений наперстков, каждое из которых – это одно из трех перемещений - A, B, C:

· A - обменять местами левый и центральный наперстки,

· B - обменять местами правый и центральный наперстки,

· C - обменять местами левый и правый наперстки.

Необходимо определить, под каким из наперстков окажется шарик после всех перемещений.

Входные данные

Строка длиной не более 50 символов из множества {A, B, C} – последовательность перемещений.

Выходные данные

Нужно вывести номер наперстка, под которым окажется шарик после перемещений.

Пример:

Решение

Эту задачу можно решить непосредственно моделированием при помощи трёх переменных, поочередно применяя к ним swap, однако проще её сделать с помощью таблицы перемещений.

Пронумеруем возможные положения шарика под напёрстками (1 – под напёрстком есть шарик, 0 – нет): 100 – 0, 010 – 1, 001 – 2.

Тогда результаты всех перемещений можно описать при помощи таблицы.

#include <iostream>
#include <string>
#include <array>


int main() {

    system("chcp 1251>nul");
    
    std::string s;

    std::cin >> s;
    
    int x = 0;
    
    std::array<std::array<int, 3>, 3> arr{ {  
    { 1, 0, 2 },
    { 0, 2, 1 },
    { 2, 1, 0 }}};

    for (int i = 0; i<s.size(); i++) { 

        int indexS; 

        if (s[i] == 'A') indexS = 0;
        else indexS = s[i] == 'B' ? 1 : 2;
        x = arr[x][indexS];
        int tmpx = x;
        std::cout << "Напёрсток с шариком = " << ++tmpx << "\n";
    }

    std::cout << "Напёрсток с шариком под "<<++x<<"-ым напёрстком\n";
    
    system("pause");

}

Телеграмм канал