Resumen de preguntas: cuadrados latinos
Análisis del título original
:
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;
}