Comprobación de Sudoku AcWing 703

Descripción del Título:

Sudoku es un popular juego para un jugador.

El objetivo es llenar la matriz de 9x9 con números de modo que cada columna, cada fila y las 9 submatrices de 3x3 no superpuestas contengan todos los números del 1 al 9.

Cada matriz de 9x9 tendrá algunos números ya dados al comienzo del juego, y generalmente hay una solución única.

1.png

2.png

Dada la matriz de Sudoku N ^ 2 ∗ N ^ 2 completada, su tarea es determinar si es una solución válida.

Una solución eficaz debe cumplir las siguientes condiciones:

  • Cada línea contiene cada número del 1 al N ^ 2, una vez por cada número.
  • Cada columna contiene cada número del 1 al N ^ 2, una vez por cada número.
  • Divida la matriz N ^ 2 ∗ N ^ 2 en N ^ 2 submatrices N ∗ N no superpuestas. Cada submatriz contiene todos los números del 1 al N ^ 2, una vez por cada número.

No necesita preocuparse por la singularidad del problema, solo verifique si la matriz dada es una solución efectiva.

Formato de entrada

La primera línea contiene un número entero T, lo que significa que hay T grupos de datos de prueba.

La primera fila de cada grupo de datos contiene el número entero N.

Las siguientes N ^ 2 líneas, cada línea contiene N ^ 2 números (ninguno de los cuales excede 1000), que se utilizan para describir la matriz completa del Sudoku.

Formato de salida

Cada grupo de datos genera un resultado y cada resultado ocupa una línea.

El resultado se expresa como "Caso #x: y", donde x es el número de grupo (comenzando desde 1), si la matriz dada es una solución válida, entonces y es Sí, de lo contrario y es No.

rango de datos

1≤T≤100,
3≤N≤6

Muestra de entrada:

3
3
5 3 4 6 7 8 9 1 2
6 7 2 1 9 5 3 4 8
1 9 8 3 4 2 5 6 7
8 5 9 7 6 1 4 2 3
4 2 6 8 5 3 7 9 1
7 1 3 9 2 4 8 5 6
9 6 1 5 3 7 2 8 4
2 8 7 4 1 9 6 3 5
3 4 5 2 8 6 1 7 9
3
1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9
3
5 3 4 6 7 8 9 1 2
6 7 2 1 9 5 3 4 8
1 9 8 3 4 2 5 6 7
8 5 9 7 6 1 4 2 3
4 2 6 8 999 3 7 9 1
7 1 3 9 2 4 8 5 6
9 6 1 5 3 7 2 8 4
2 8 7 4 1 9 6 3 5
3 4 5 2 8 6 1 7 9

Salida de muestra:

Case #1: Yes
Case #2: No
Case #3: No
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>

using namespace std;
const int MAX = 50;

int a[MAX][MAX];
int n, T, N;
bool row[MAX][MAX], col[MAX][MAX], tip[MAX][MAX][MAX];

bool judge()
{
    for(int i = 0; i < N; i++)
    {
        for(int j = 0; j < N; j++)
        {
            int x = a[i][j];
            if(x >= 1 && x <= N && !row[i][x] && !col[j][x] && !tip[i / n][j / n][x])
            {
                row[i][x] = col[j][x] = tip[i / n][j / n][x] = true;
            }
            else
                return false;

        }
    }
    return true;
}

int main()
{
    scanf("%d", &T);

    int k = 1;

    while(T--)
    {
        memset(row, false, sizeof(row));
        memset(col, false, sizeof(col));
        memset(tip, false, sizeof(tip));

        scanf("%d", &n);
        N = n * n;

        for(int i = 0; i < N; i++)
        {
            for(int j = 0; j < N; j++)
                scanf("%d", &a[i][j]);
        }

        if(judge())
            printf("Case #%d: Yes\n", k++);
        else
            printf("Case #%d: No\n", k++);
    }
    return 0;
}

 

Supongo que te gusta

Origin blog.csdn.net/weixin_44620183/article/details/113779247
Recomendado
Clasificación