Programación de la semana de pensamiento 6 simulación de tiempo limitado

Titulo

Dongdong tiene naipes A × B. Cada carta tiene un tamaño (entero, a, rango 0 a A-1) y un palo (entero, b), rango 0 a B-1.
Las cartas son diferentes, también Es único, es decir, no hay dos cartas del mismo tamaño y palo.
"Una mano" significa que tienes 5 cartas diferentes en tu mano. Estas 5 cartas no están en el orden de quién está al frente y quién está detrás. Pueden formar un tipo de tarjeta. Hemos definido 9 tipos de tarjeta. Las siguientes son las reglas de los tipos de tarjeta 9. Usamos "prioridad de número de serie baja" para que coincida con los tipos de tarjeta, es decir, la "primera mano" se encuentra con la primera desde arriba. Una regla de tipo de carta es su "número de carta" (un número entero, del 1 al 9):
Escalera de color: se cumplen la Regla 5 y la regla 4.
Bomba: 5 cartas de las cuales 4 cartas son del mismo tamaño.
Tres cinturones dos: Entre las 5 cartas, 3 son del mismo tamaño y las otras 2
son del mismo
tamaño . Rectas: 5 cartas son del mismo palo. Rectas: 5 cartas del mismo tamaño que x, x + 1, x + 2, x + 3, x + 4
tres: 5 cartas que es igual al tamaño de tres cartas.
dos pares: 5 cartas que es igual al tamaño de dos tarjetas, Además la tarjeta 2 es igual al tamaño de tres cartas.
Un par:. 5 cartas que es igual al tamaño de dos tarjetas
para pagar: la mano no satisface cualquiera de un tipo de tarjeta.
Ahora, a partir del Este A ¡Se tomaron 2 cartas de las cartas B! Son (a1, b1) y (a2, b2). (Donde a es el tamaño yb es el palo)
Ahora sacaremos al azar las cartas restantes ¡3 cartas! ¡Forma una carta de mano!
De hecho, además de jugar códigos, Dongdong sigue siendo un mago en su tiempo libre. Ahora quiere predecir la posibilidad de su futuro, es decir, la posibilidad de la "primera mano" que obtendrá. Usamos un "número de tarjeta (un número entero , Perteneciente a 1 a 9) "para indicar el tipo de mano de esta mano, entonces tiene 9 posibilidades en el futuro, pero el número de cada posible esquema es diferente.

Entrada

La línea 1 contiene enteros A y B (5 ≤ A ≤ 25, 1 ≤ B ≤ 4). La
línea 2 contiene enteros a1, b1, a2, b2 (0 ≤ a1, a2 ≤ A-1, 0 ≤ b1 , b2 ≤ B-1, (a1, b1) ≠ (a2, b2)).

Salida

Se emite una línea. Hay 9 enteros en esta línea, y cada número entero representa el número de esquemas de 9 tipos de tarjeta (en orden de número de tarjeta de pequeño a grande).

Entrada de muestra

5 2
1 0 3 1

Muestra de salida

0 0 0 0 8 0 12 36 0

Ideas

El tipo de tarjetas es 4 * 25 = 100 como máximo, y la cantidad de datos es pequeña. Elija 3 tarjetas en un bucle directo de tres capas con una complejidad de O (n 3 ), lo cual es aceptable.
Agregue todos los tipos de tarjeta (excepto los dos dados) a la matriz de tarjeta de estructura. El bucle de tres capas de la matriz selecciona tres cartas y juzga el tipo de carta de una mano.
Para comparar el tamaño de las tarjetas, hagaTarjetas ordenadas. Después de ordenar las 5 tarjetas, solo necesita comparar el tamaño de las tarjetas en la posición especial para determinar el tipo de tarjeta. Por ejemplo, siNúmero 0 y Número 3Del mismo tamaño oNumero 1 y Numero 4Es del mismo tamaño queBomba

Código

#include <cstdio>
#include <algorithm>
using namespace std;
struct card{
    int suit,val;
    card& operator=(card c){suit=c.suit;val=c.val;return *this;}
    bool operator==(card c){return suit==c.suit&&val==c.val;}
    bool operator<(card c)const{return val!=c.val?val<c.val:suit<c.suit;}
}c[105],tmp[6];
int sum[10];
int A,B;

void judge(){
    bool flags=true,flagv=true;
    for(int i=0;i<4;i++){
        if(tmp[i+1].val-tmp[i].val!=1)
            flagv=false;
        if(tmp[i+1].suit!=tmp[i].suit)
            flags=false;
    }
    if(flags&&flagv)//同花顺
        sum[1]++;
    else if(flags)//同花
        sum[4]++;
    else if(flagv)//顺子
        sum[5]++;
    else{
        if((tmp[0].val==tmp[3].val)||(tmp[1].val==tmp[4].val))//炸弹
            sum[2]++;
        else if((tmp[0].val==tmp[1].val&&tmp[2].val==tmp[4].val)||(tmp[0].val==tmp[2].val&&tmp[3].val==tmp[4].val))//三带二
            sum[3]++;
        else if(tmp[0].val==tmp[2].val||tmp[2].val==tmp[4].val||tmp[1].val==tmp[3].val)//三条
            sum[6]++;
        else if(tmp[0].val==tmp[1].val&&tmp[2].val==tmp[3].val)//两对
            sum[7]++;
        else if(tmp[0].val==tmp[1].val&&tmp[3].val==tmp[4].val)//两对
            sum[7]++;
        else if(tmp[1].val==tmp[2].val&&tmp[3].val==tmp[4].val)//两对
            sum[7]++;
        else{
            bool flag=false;
            for(int i=0;i<4;i++){
                if(tmp[i+1].val==tmp[i].val)
                    flag=true;
            }
            if(flag)
                sum[8]++;
            else sum[9]++;
        }
    }
}

int main(){
    memset(sum, 0, sizeof(sum));
    scanf("%d%d",&A,&B);
    int a1,b1,a2,b2;
    scanf("%d%d%d%d",&a1,&b1,&a2,&b2);
    int k=0;
    for(int i=0;i<A;i++){
        for(int j=0;j<B;j++){
            if(!(i==a1&&j==b1)&&!(i==a2&&j==b2)){
                c[k].val=i;c[k].suit=j;
                k++;
            }
        }
    }
    for(int i=0;i<k;i++){
        for(int j=i+1;j<k;j++){
            for(int m=j+1;m<k;m++){
                tmp[0].val=a1;tmp[0].suit=b1;
                tmp[1].val=a2;tmp[1].suit=b2;
                tmp[2]=c[i];
                tmp[3]=c[j];
                tmp[4]=c[m];
                sort(tmp,tmp+5);
                judge();
            }
        }
    }
    for(int i=1;i<=9;i++)
        printf("%d ",sum[i]);
    return 0;
}

Resumen

Al principio pensé en la enumeración recursiva, pero obviamente no lo haré. .
Enlace del título

Publicado 24 artículos originales · elogiado 2 · visitas 435

Supongo que te gusta

Origin blog.csdn.net/weixin_43805228/article/details/105281607
Recomendado
Clasificación