2020/08/13 Torneo por equipos (Medicina de L-Huatuo, H-Sudoku)

Visión general

En la competencia por equipos de esta tarde, el equipo tenía un total de 5 preguntas A, I A tenía dos preguntas, una era una pregunta sobre el agua y la otra era una pregunta dfs.

tema

L - Medicina de Huatuo

Huatuo era un médico famoso. Usa botellas idénticas para llevar la medicina. Existen diferentes tipos de medicamentos. Huatuo puso medicamentos en las botellas y encadenó estas botellas.

Sin embargo, hubo un problema crítico. Cuando Huatuo llegó a la casa del paciente, sacó la cadena de su bolso y no pudo reconocer qué botella contiene qué tipo de medicamento, pero recuerda el orden de las botellas en la cadena.

Huatuo tiene su propia solución para resolver este problema. Cuando necesite traer 2 tipos de medicamentos, por ejemplo, A y B, pondrá A en un frasco y B en dos frascos. Luego, encadenará las botellas en el orden de ′ −B − A − B− ′. De esta manera, cuando llegó a la casa del paciente, supo que el frasco del medio es el medicamento A y el frasco de los dos lados es el medicamento B.

Ahora debes ayudar a Huatuo a determinar cuál es la cantidad mínima de frascos necesarios si quiere traer N
tipos de medicamentos.
Entrada
La primera línea de la entrada da el número de casos de prueba, T (1≤T≤100). Siguen las líneas T. Cada línea consta de un número entero N (1≤N≤100)
, el número de tipos de medicamento.
Salida
Para cada caso de prueba, genere una línea que contenga Caso #x: y, donde x es el número de caso de prueba (comenzando desde 1) e y
es el número mínimo de botellas que Huatuo necesita.
Entrada de muestra

1
2

Salida de muestra

Case #1: 3

Una pregunta sobre el agua significa que puede ayudar a Hua Tuo a distribuir medicamentos para que pueda encontrarlos rápidamente.
El tema ha dado la idea -ABA-, y luego -ABCBA-, por lo que se puede ver que el número de frascos necesarios es el doble del número de tipos de fármaco menos uno, que pertenece a una recursividad simple.
Código AC

#include <stdio.h>
#include<stdlib.h>
#include <string.h>
#include <math.h>
int main()
{
    
    
    int t,n,i=0;
    scanf("%d",&t);
    while(t--)
    {
    
    
        scanf("%d",&n);
        printf("Case #%d: %d\n",++i,2*n-1);

    }
    return 0;
}

H - Sudoku

Yi Sima fue uno de los mejores consejeros de Cao Cao. A él le gusta jugar a un juego divertido. Parece el Sudoku moderno, pero más pequeño.

En realidad, Yi Sima estaba jugando de manera diferente. En primer lugar, trató de generar un tablero de 4 × 4 con cada fila contiene 1 a 4, cada columna contiene 1 a 4. También se aseguró de que si cortamos el tablero en cuatro
piezas de 2 × 2 , cada pieza contiene 1 a 4.

Luego, sacó varios números del tablero y se los dio a otro chico para que los recuperara. Como otros consejeros no son tan inteligentes como Yi Sima, Yi Sima siempre se aseguró de que la junta solo tuviera una forma de recuperarse.

En realidad, estás viendo esto porque has pasado a la Era de los Tres Reinos. Puedes recuperar el tablero para hacer feliz a Yi Sima y ser ascendido. Ve y hazlo !!!

Entrada

La primera línea de la entrada da el número de casos de prueba, T (1≤T≤100).
Siguen los casos de prueba T. Cada caso de prueba comienza con una línea vacía seguida de 4 líneas.
Cada línea consta de 4 caracteres. Cada carácter representa el número en la celda correspondiente (uno de '1', '2', '3', '4'). '*' representa que el número fue eliminado por Yi Sima.
Está garantizado que habrá exactamente una forma de recuperar la placa.

Salida
Para cada caso de prueba, genere una línea que contenga Caso #x:, donde x
es el número de caso de prueba (comenzando desde 1). Luego, imprima 4 líneas con 4 caracteres cada una. indicar el tablero recuperado.
Entrada de muestra

3
****
2341
4123
3214
*243
*312
*421
*134
*41*
**3*
2*41
4*2*

Salida de muestra

Case #1:
1432
2341
4123
3214
Case #2:
1243
4312
3421
2134
Case #3:
3412
1234
2341
4123

A Sima Yi le gusta jugar al Sudoku y finalmente unificó el mundo, por eso le gusta jugar al Sudoku == puede unificar el mundo. (Es una broma [riendo y llorando])
Esta es una pregunta dfs, como una pregunta clásica en un tablero de ajedrez. Debes probar una por una si cumples con las condiciones. Si puedes, continúa y vuelve si no lo haces.
La condición de salida es que ha atravesado de (1,1) a (4,4).

Código AC

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
char s[10];
int f;
int hang[10][10], lie[10][10], m[10][10];
int g(int x, int y, int a)//g函数为判断一个点是否符合要求的函数
{
    
    
    for (int i = 1; i <= 4; i++)//行不重
    {
    
    
        if (m[x][i] == a)
            return 0;
    }
    for (int i = 1; i <= 4; i++)//列不重
    {
    
    
        if (m[i][y] == a)
            return 0;
    }
    if(x>0&&x<3)//左上、左下、右上、右下四个小正方形不重
    {
    
    
        if(y>0&&y<3)
        {
    
    
            if(m[1][1]==a||m[1][2]==a||m[2][1]==a||m[2][2]==a)
                return 0;
        }
        else if(m[1][3]==a||m[1][4]==a||m[2][3]==a||m[2][4]==a)
            return 0;
    }
    else
    {
    
    
        if(y>0&&y<3)
        {
    
    
            if(m[3][1]==a||m[3][2]==a||m[4][1]==a||m[4][2]==a)
                return 0;
        }
        else if(m[3][3]==a||m[3][4]==a||m[4][3]==a||m[4][4]==a)
            return 0;
    }
    return 1;
}
void dfs(int x, int y)//深度优先搜索
{
    
    
    if (f)
    return;//f==1,逐层退出递归
    else if (y > 4)
    {
    
    
        for (int i = 1; i <= 4; i++)
        {
    
    
            for (int j = 1; j <= 4; j++)
            {
    
    
                printf("%d", m[i][j]);
            }
            printf("\n");
        }
        f = 1;
        return;
    }
    else if (x > 4)//x第一次大于4,即第一列遍历完成
        dfs(1, y + 1);
    else if (!m[x][y])
    {
    
    
        for (int i = 1; i <= 4; i++)
        {
    
    
            if (!hang[x][i] && !lie[y][i] && g(x, y, i))
            {
    
    
                hang[x][i] = lie[y][i] = 1;
                m[x][y] = i;
                dfs(x + 1, y);
                m[x][y] = 0;
                hang[x][i] = lie[y][i] = 0;
            }
        }
    }
    else dfs(x + 1, y);
}
int main()
{
    
    
    int t, i, j, k = 1;
    scanf("%d", &t);
    while (t--)
    {
    
    
        memset(hang, 0, sizeof(hang));
        memset(lie, 0, sizeof(lie));
        for (i = 1; i <= 4; i++)
        {
    
    
            scanf("%s", s);
            for (j = 1; j <= 4; j++)
            {
    
    
                if (s[j-1] == '*')
                {
    
    
                    m[i][j] = 0;//标记该位置有没有数字
                }
                else
                {
    
    
                    m[i][j] = s[j-1] - '0';
                    hang[i][m[i][j]] = 1;
                    lie[j][m[i][j]] = 1;
                }
            }
        }
        f = 0;
        printf("Case #%d:\n", k++);
        dfs(1, 1);
    }
    return 0;
}

para resumir

El tema de dfs todavía no es lo suficientemente familiar, lo que lleva a perder mucho tiempo en el tema. Es necesario practicar dfs y bfs.
¡Venga! ! ! !

Supongo que te gusta

Origin blog.csdn.net/rookie636/article/details/107990465
Recomendado
Clasificación