魔方矩阵 在魔方阵中,所有的行、列和对角线都拥有相同的和。例如: 17 24 1 8 15 23 5 7 14 16 4 9 2 4 6 13 20 22 和 3 5 7 10 12 19 21 3 8 1 6 11 18 25 2 9 写一个程序读入一个二维整型数组并判断它是否为魔方矩阵。 **输入格式要求:"%d" 提示信息:"请输入矩阵的阶数(<=10):" "请输入矩阵:\n" "a[%d][%d]:" **输出格式要求:"该矩阵不是魔方阵!\n" "该矩阵为魔方矩阵!" 程序运行示例: 请输入矩阵的阶数(<=10):3 请输入矩阵: a[0][0]:4 a[0][1]:6 a[0][2]:3 a[1][0]:8 a[1][1]:1 a[1][2]:9 a[2][0]:4 a[2][1]:6 a[2][2]:8 该矩阵不是魔方阵!
#include<stdio.h>
int main()
{
int a[10][10],n,flag=1;
printf("请输入矩阵的阶数(<=10):");
scanf("%d",&n);
printf("请输入矩阵:\n");
int i,j;
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
printf("a[%d][%d]:",i,j);
scanf("%d",&a[i][j]);
}
}
int sum=0,s1[10],s2[10],s3=0,s4=0;
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
sum+=a[i][j];
}
s1[i]=sum;//将每一行的和保存到s1数组中
sum=0;
}
for(j=0;j<n;j++)
{
for(i=0;i<n;i++)
{
sum+=a[i][j];
}
s2[j]=sum;将每列的和保存到s2数组中
sum=0;
}
for(i=0;i<n;i++)
{
s3+=a[i][i];//主对角线之和
s4+=a[i][n-i-1];//副对角线之和
}
for(i=0;i<n;i++)
{
if(s1[0]!=s1[i]) flag=0;//让每一行之和相等
if(s2[0]!=s2[i]) flag=0;//让每一列之和相等
if(s1[0]!=s2[0]) flag=0;//让行之和与列之和相等
if(s1[0]!=s3) flag=0;//让行之和与主对角线之和相等
if(s1[0]!=s4) flag=0;//让行之和与副对角线之和相等
}
if(flag==1) printf("该矩阵为魔方矩阵!");
else printf("该矩阵不是魔方阵!\n");
return 0;
}
2024.8.7题解
#include<stdio.h>
const int size = 10;
void init(int a[][size],int n)
{
int i, j;
for (i = 0; i < n; i++)
{
for (j = 0; j < n; j++)
{
printf("a[%d][%d]:", i, j);
scanf_s("%d", &a[i][j]);
}
}
}
int deng(int a[], int n)//判断一个数组里面的数是不是全相等
{
int x = a[0];
int i;
for (i = 1; i < n; i++)
{
if (a[i] != x) return 0;
}
return 1;
}
void sum_hang(int a[][size], int sum1[], int n)
{
int i, j;
for (i = 0; i < n; i++)
{
for (j = 0; j < n; j++)
{
sum1[i] += a[i][j];
}
}
}
void sum_lie(int a[][size], int sum2[], int n)
{
int i, j;
for (i = 0; i < n; i++)
{
for (j = 0; j < n; j++)
{
sum2[i] += a[j][i];
}
}
}
void sum_duijiao(int a[][size], int sum3[],int n)
{
int i, j;
for (i = 0; i <= 1; i++)
{
for (j = 0; j < n; j++)
{
if (i == 0)sum3[i] += a[j][j];
if (i == 1)sum3[i] += a[j][n - 1 - j];
}
}
}
void judge(int a[][size], int n)
{
int sum1[size] = { 0 }, sum2[size] = { 0 }, sum3[2] = { 0 };
sum_hang(a, sum1, n);
sum_lie(a, sum2, n);
sum_duijiao(a, sum3, n);
if (deng(sum1, n) && deng(sum2, n) && deng(sum3, 2)
&& sum1[0] == sum2[0] && sum1[0] == sum3[0]) printf("是魔方矩阵");
else printf("不是魔方矩阵");
}
int main()
{
int n;
int a[size][size];
printf("请输入矩阵的阶数(<=10):");
scanf_s("%d", &n);
printf("请输入矩阵:\n");
init(a, n);
judge(a, n);
return 0;
}