检查我的矩阵是否是魔方

时间:2017-11-29 14:32:17

标签: c

所以我有这个矩阵:

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");
    }

目前我的函数只检查行值。我想知道是否也可以检查列和斜线?

2 个答案:

答案 0 :(得分:0)

在嵌套的for循环中执行所有操作都是一个有趣的问题。

唯一的小挑战是计算总和,因为,编写循环的方式,首先似乎是数组[维度] 必要的。

然而,一个小技巧是有帮助的。此行获取行值

int rownum = *(mat + i * dimension + j);

也可以通过反转ij

来获取col值
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;
}
相关问题