fbpx

Problema #2262 – scrabble – Rezolvari PBInfo

de Mihai-Alexandru

Scrabble (jocul cuvintelor) este un joc în care participanții formează cuvinte prin plasarea de litere pe orizontală sau pe verticală, iar punctajul obținut este cu atât mai mare cu cât literele folosite sunt mai rare (mai valoroase).
Vă propunem un altfel de scrabble, joc unde jucătorul primește n piese speciale de scrabble. Astfel, fiecare piesă are inscripționate două litere mari ale alfabetului englez A...Z, una dintre litere fiind consoană, cealaltă fiind vocală. Jucătorul poate forma cuvinte prin alăturarea pieselor pe orizontală.
Un cuvânt este considerat valid dacă respectă următoarele condiții:

  • folosește cel puțin două piese;
  • cuvântul format nu conține pe poziții consecutive litere egale sau litere de același tip (vocale/consoane).

Cuvântul este cu atât mai valoros cu cât folosește mai multe piese de scrabble.

Cerința

Să se determine cuvântul de lungime maximă care se poate forma cu cele n piese. Dacă sunt mai multe cuvinte de lungime maximă atunci se va afișa cel mai mare lexicografic alfabetic.

Date de intrare

Fișierul de intrare scrabble.in conține pe prima linie numărul n, iar pe următoarele n linii descrierea pieselor de scrabble sub forma a două caractere literă mare ale alfabetului englez.

Date de ieșire

Fișierul de ieșire scrabble.out va conține pe prima linie cuvântul de lungime maximă format.

Restricții și precizări

  • 1 ≤ n ≤ 18
  • nu există piese identice
  • piesele nu se pot roti
  • sunt considerate vocale caracterele: AEIOU
  • lungimea maximă a unui cuvânt format nu poate depăși 10 piese

Exemplu

scrabble.in

6
AB
EC
BE
BA
CA
AC

scrabble.out

ECACAB

Explicație

Sunt mai multe cuvinte cu număr maxim de piese (3) care se pot forma:
ABECAC, ABACEC, ECABAC, ECACAB, BEBACA,…
Dintre acestea cel maxim lexicografic generat este: ECACAB.

#include <bits/stdc++.h>

using namespace std;
#define mod 1234567
ifstream cin("scrabble.in");
ofstream cout("scrabble.out");

int n , nv , nc;
char s[3] , v[20][3] , c[20][3] , voc[] = "AEIOU";

void ord(char a[][3] , int n)
{
    for(int i = 1 ; i <= n ; i++)
        for(int j = i + 1 ; j <= n ; j++)
            if(strcmp(a[i] , a[j]) < 0)
                {
                    char aux[3];
                    strcpy(aux , a[i]);
                    strcpy(a[i] , a[j]);
                    strcpy(a[j] , aux);
                }
}

int main()
{
    cin >> n;
    for(int i = 1 ; i <= n ; i++)
    {
        cin >> s;
        if(strchr(voc , s[0])) strcpy(v[++nv] , s);
        else strcpy(c[++nc] , s);
    }
    ord(v , nv);
    ord(c , nc);
    if(nc < nv)
        for(int i = 1 ; i <= nv ; i++) cout << v[i];
    else if(nv < nc)
        for(int i = 1 ; i <= nc ; i++) cout << c[i];
    else if(c[1][0] < v[1][0])
        for(int i = 1 ; i <=nv ; i++) cout << v[i];
    else
        for(int i = 1 ; i <= nc ; i++) cout << c[i];
}
Comentarii

S-ar putea sa iti placa