原题
题意分析:
题目就是输入一个二维数组(用来表示矩阵),判断对于矩阵中的每一个数字是否在该数字所在的行、所在的列的只出现一次(相当于数独的概念)。如果是的话,则该矩阵是拉丁方,再判断矩阵的第一行、第一列的元素是否按照升序的方式排列的,从而进行对应的判断输出
做题思路:
代码实现
#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;
}