Перекласти

Задача А

Задача A. Покер
Ім’я вхідного файлу: іnput.txt
Ім’я вхідного файлу: output.txt
Ліміт часу: 1с.
Задано 5 цілих чисел. Серед них:
·         якщо однакові 5, то вивести "Impossible", інакше
·         якщо однакові 4, то вивести "Four of a Kind", інакше
·         якщо однакові 3 и 2, то вивести "Full House", інакше
·         якщо є 5 послідовних, то вивести "Straight", інакше
·         якщо однакові 3, то вивести "Three of a Kind", інакше
·         якщо однакові 2 і 2, то вивести "Two Pairs", інакше
·         якщо однакові 2, то вивести "One Pair", інакше
·         вивести "Nothing".
Вхідні дані
У першому рядку задано 5 чисел (від 1 до 13 включно) через пропуск.
Вихідні дані
Виводиться один рядок - результат аналізу.
Приклади
іnput.txt
output.txt
1 3 9 3 2
One Pair
1 5 5 4 4
Two Pairs
10 11 12 13 1
Nothing

Ідея: Підготувати дані для аналізу (створивши спеціальний масив) та обчислити кількості повторень чисел в послідовності та послідовно перевірити всі умови, які наведені в задачі.

Для аналізу даних створити масив, який зберігатиме не самі числа, а кількість їх повторень у заданій послідовності (нижче наведено вигляд масиву, для першого прикладу):
1
2
3
4
5
6
7
8
9
10
11
12
13
1
1
2





1





Використати 5 лічильників, щоб порахувати, скільки разів зустрічаються в масиві числа 1,2,3,4,5.

Відповідно до умови задачі перевірити кожну умову та вивести відповідь. Перевіряти потрібно в тому ж порядку, як це описано в умові: якщо певна умова виконується, то наступні не будуть виконуватись (оскільки вони суперечать попереднім умовам) і їх можна не перевіряти.

Особливою перевіркою є випадок 5 одиниць: якщо вони йдуть одна за одною без пропусків, то це «Straight», інакше «Nothing». Тому під час обчислення кількості «1» можна запам’ятати, наприклад, позицію останньої (nomLastOne ) знайденої «1». А під час перевірки умови для «Straight», порахувати кількість «1», що йдуть підряд без пропусків.

Для прискорення роботи програми цикл, якщо знайдена відповідь – зупиняється командою break або переходить до пошуку наступної відповіді за допомогою команди continue, пропускаючи умови, які точно не виконуються на поточному кроці циклу.


#include <stdio.h>
#include <vector>
using namespace std;

vector<int> v(14, 0);
//----------------------------------------
int main()
{
       freopen("input.txt", "r", stdin);
       freopen("output.txt", "w", stdout);

       int x;
       for(int i=0; i<5; ++i){
             scanf("%d", &x);
             v[x]++;
       }

       int k1=0, k2=0, k3=0, k4=0, k5=0;
       int nomLastOne;
       for(int i=0; i<14; ++i){
             if(v[i]==5) { k5++; break; }
             if(v[i]==4) { k4++; break; }
             if(v[i]==3) { k3++; continue; }
             if(v[i]==2) { k2++; continue; }
             if(v[i]==1) {k1++; nomLastOne=i;}

       }

       if(k5==1)                  { printf("Impossible\n"); return 0; }
       if(k4==1)                  { printf("Four of a Kind\n"); return 0; }
       if(k3==1 && k2==1)  { printf("Full House\n"); return 0; }
       if(k1==5)                  {
             int i=nomLastOne;
             while(i>=0 && v[i]==1) --i;
             ++i;
             if(nomLastOne-i+1==5){
                    printf("Straight\n");
                    return 0;
             }           
       }
       if(k3==1)                  { printf("Three of a Kind\n"); return 0; }
       if(k2==2)                  { printf("Two Pairs\n"); return 0; }
       if(k2==1)                  { printf("One Pair\n"); return 0; }
       printf("Nothing\n");

       return 0;
}


Немає коментарів:

Дописати коментар