Resumen de preguntas: cuadrados latinos

Resumen de preguntas: cuadrados latinos


Análisis del título original
Captura de pantalla del tema
Pregunta de muestra
:

La pregunta es ingresar una matriz bidimensional (utilizada para representar la matriz) y juzgar si cada número en la matriz aparece solo una vez en la fila y columna del número (equivalente al concepto de Sudoku). En caso afirmativo, la matriz es un cuadrado latino y luego juzgue si los elementos de la primera fila y la primera columna de la matriz están dispuestos en orden ascendente, para realizar la salida de juicio correspondiente.

Ideas de preguntas:

  • Dado que los datos de entrada contienen caracteres, la matriz bidimensional que almacena los datos debe utilizar el tipo char
  • Luego ingrese la matriz bidimensional y la transposición de esta matriz para convertirla al tipo int, y los caracteres se convierten en consecuencia
  • Para cada número de la matriz, registre la cantidad de veces que el número aparece en su fila y columna (usando subíndices de matriz)
  • Si aparece un número en la fila o columna> = 2, la matriz no es un cuadrado latino; si todos los números aparecen en la fila o columna <= 1, la matriz es un cuadrado latino
  • Para el lado latino, juzgue si la primera fila y la primera columna de la matriz están dispuestas en orden ascendente (use un bucle, si el último elemento es más pequeño que el elemento anterior, no lo es)

Código

#include<bits/stdc++.h>    //万能头文件
using namespace std;
int main()
{
    
    
    int n,i,j,num,num1,num2,flag=0;
    char a[50][50],b[50][50];
    int c[50][50],d[50][50],x[50][50],y[50][50];
    cin>>n;
    for(i=0;i<n;i++)
    {
    
    
        for(j=0;j<n;j++)
        {
    
    
            cin>>a[i][j];
            b[j][i]=a[i][j];        //矩阵的转置
            if(a[i][j]>='0' && a[i][j]<='9')     //对应字符的转换
            {
    
    
                num1=a[i][j]-48;
            }
            else if(a[i][j]>='A' && a[i][j]<='Z')
            {
    
    
                num1=a[i][j]-55;
            }
            
            if(b[j][i]>='0' && b[j][i]<='9')
            {
    
    
                num2=b[j][i]-48;
            }
            else if(b[j][i]>='A' && b[j][i]<='Z')
            {
    
    
                num2=b[j][i]-55;
            }
            x[i][j]=num1,y[j][i]=num2;       //char类型转换为int类型
            c[i][num1]++;
            d[j][num2]++;
        }
    }
	//判断是否每个数字在其所在行、所在列只出现一次
    for(i=0;i<n;i++)
    {
    
    
        for(j=0;j<=35;j++)
        {
    
    
            if(c[i][j]>=2 || d[i][j]>=2)    //如果出现次数>=2,标志变量flag=1,表示该矩阵不是拉丁方
            {
    
    
                flag=1;
                break;
            }
        if(flag==1)
        {
    
    
            break;
        }               
    }
    //int f=0,cnt=0;
    if(flag==0)             //如果该矩阵是拉丁方,判断第一行、第一列的元素是否升序排列
    {
    
    
        for(i=1;i<n;i++)
        {
    
    
            if(x[0][i]<=x[0][i-1] || y[0][i]<=y[0][i-1])   //升序排列的判断过程
            {
    
    
                cout<<"Not Reduced"<<endl;
                break;
            }
            //cnt++;
        }
        if(i==n)
        {
    
    
            cout<<"Reduced"<<endl;
        }
        //cout<<"Yes"<<endl;

    }
    else
    {
    
    
        cout<<"No"<<endl;
    }
    //system("pause");
    return 0;
}

Supongo que te gusta

Origin blog.csdn.net/m0_46772594/article/details/107870922
Recomendado
Clasificación