所以我有这个矩阵:
8 1 6
3 5 7
4 9 2
现在我想检查这是否是一个“魔术广场”。这意味着所有行,列和斜线的总和分别相等(这里的值为15)。
因为我想尽可能高效地完成这项工作,我需要先打印我的矩阵,我想在同一个函数中进行所有值检查:
void printmatrix(int *mat, int dimension) {
int i, j, rowscount, colcount;
int firstvalue = 0;
int ismagicsquaere = 0;
for (i = 0; i < dimension; i++)
{
rowscount = 0;
for (j = 0; j < dimension; j++)
{
int num = *(mat + i * dimension + j);
if (i == 0)
firstvalue += num;
else
rowscount += num;
printf("%d\t", num);
}
if (rowscount != firstvalue)
ismagicsquaere = 0;
printf("\n\n");
}
目前我的函数只检查行值。我想知道是否也可以检查列和斜线?
答案 0 :(得分:0)
在嵌套的for
循环中执行所有操作都是一个有趣的问题。
唯一的小挑战是计算列总和,因为,编写循环的方式,首先似乎是数组[维度] 必要的。
然而,一个小技巧是有帮助的。此行获取行值
int rownum = *(mat + i * dimension + j);
也可以通过反转i
和j
int colnum = *(mat + j * dimension + i);
允许在同一个地方对列进行求和(矩阵为正方形!)
void printmatrix(int *mat, int dimension) {
int i, j;
int magic=1; // default to "is magic"
int d1=0,d2=0,refcount=0; // diag1, diag2
for (i = 0 ; i < dimension; i++) {
int rowcount = 0;
int colcount = 0;
for (j = 0; j < dimension; j++) {
int num = *(mat + i * dimension + j);
rowcount += num; // row sum
if (i == j) d1 += num; // diag1 sum
if (i == dimension-j-1) d2 += num; // diag2 sum
// row to col ...
colcount += *(mat + j * dimension + i); // col sum
}
if (!i) refcount = rowcount; // first rowcount is reference
else if (refcount != rowcount) magic = 0;
if (refcount != colcount) magic = 0;
}
if (d1 != refcount || d2 != refcount) magic = 0;
printf("Is Magic: %s\n", magic ? "Yes":"No");
}
答案 1 :(得分:0)
我编写了以下代码,目的是编写(一天)一个详细阐述幻方的代码。
它将所有行,列和对角线总和存储到矩阵中。这个矩阵(sum[][]
)的目的是要理解魔方不正确的地方。
主函数调用函数checkAndComputeSums()
来计算所有和,如果魔术方格中的数据是正确的,则返回1,如果不正确,则返回0。
这里是代码:
#include <stdio.h>
#define DIMS 3
#define COLS DIMS
#define ROWS DIMS
int checkAndComputeSums(int *s , int *ms, int dim);
enum STYPE {
SUMROW,
SUMCOL,
SUMDIAG,
//-------------------
SUMCNT
};
int msqr[COLS][ROWS] = {
{ 8, 1, 6},
{ 3, 5, 7},
{ 4, 9, 2}
};
int sum[DIMS][SUMCNT];
const char * label[SUMCNT] = {
"ROWS","COLS","DIAG"
};
int checkAndComputeSums(int *s , int *ms, int dim)
{
int i,j,ok=1;
/* The sum are cleared */
for(i=0;i<dim;i++) {
for(j=0;j<SUMCNT;j++) {
s[i*SUMCNT+j] =0;
}
}
for(i=0;i<dim;i++) {
for(j=0;j<dim;j++) {
s[i*SUMCNT+SUMROW]+=ms[i*dim+j];
s[i*SUMCNT+SUMCOL]+=ms[j*dim+i];
if (i==j)
s[SUMDIAG]+=ms[i*dim+j];
if (i==dim - j - 1)
s[SUMDIAG+SUMCNT]+=ms[i*dim+j];
}
if (s[i*SUMCNT+SUMROW]!=s[SUMROW] || s[i*SUMCNT+SUMCOL]!=s[SUMROW])
ok=0;
}
if (s[SUMDIAG]!=s[SUMROW] || s[SUMDIAG+SUMCNT]!=s[SUMROW])
ok=0;
return ok;
}
int main(void)
{
int i,j;
i=checkAndComputeSums(sum[0],msqr[0],DIMS);
printf("The check was %s\n",(!i)?"KO":"OK");
for (j=SUMROW;j<SUMCNT;j++) {
printf("%s: ",label[j]);
for(i=0;i<DIMS-((j==SUMDIAG)?1:0);i++) {
printf("%d ",sum[i][j]);
}
puts("");
}
return 0;
}