q8111 2019-10-25 15:43 采纳率: 0%
浏览 314

四阶魔方阵的计算,运行结果为什么错误?

图片说明
/*
3阶魔法阵:
2 9 4 sum行=15
3 5 7 sum列=15
6 1 8 sum对角=15
下面计算4阶魔法阵
*/
#include
int main()
{
int n=4;// scanf("%d",&n);
int m=n*n;////////////////////////////魔方阶数
int z,x,c,v,b1,b2;//////////循环
int a[17]={0};///////萝卜坑
int i=n+1,j=n+1,w[i][j];////////////////////////////二维数组,魔方阵
//
i=0;j=0;
for(z=1;z<=m;z++)
{
a[z]++;
if(z==1) a[z]--;//............................特例排除
if(a[z]==0)
{
a[z]++;
i++;
//......................................确定二维数组行标
j++;w[i][j]=z;
for(x=1;x<=m;x++)
{
if(a[x]==0)
{
a[x]++;
j++;w[i][j]=x;
for(c=1;c<=m;c++)
{
if(a[c]==0)
{
a[c]++;
j++;w[i][j]=c;
for(v=1;v<=m;v++)
{
if(a[v]==0)
{
a[v]++;
j++;w[i][j]=v;
//......................................二维数组列标归零
j=0;
}
}
}

            }
    }

    }
}
}
///////////////////输出魔方阵
for(b1=1;b1<=n;b1++)
{
    for(b2=1;b2<=n;b2++)    
    {
        printf("%d ",w[i][j]);
    }
    printf("\n");
}
return 0;

}


  • 写回答

1条回答 默认 最新

  • 你知我知皆知 2024-07-29 21:14
    关注

    以下回答参考 皆我百晓生券券喵儿 等免费微信小程序相关内容作答,并由本人整理回复。

    这段代码在运行时遇到了一些问题。首先,代码中存在一个逻辑错误:当a[z] == 0时,它会尝试将z赋值给a[z],但这样做是不正确的。其次,代码没有正确处理a[n-1] = 0的情况。

    解决这些问题的方法是将a[n-1]初始化为0,并在循环开始前将其设置为0,以避免出现意外的行为。此外,还应该检查是否有任何元素被赋值为0,并相应地调整循环结构。

    修复后的代码如下:

    #include <stdio.h>
    
    int main() {
        int n = 4; // 魔方的阶数
        int a[17], m = n * n; // 定义矩阵大小和魔方阶数
    
        // 初始化a[16]为0,表示魔方的所有位置都未被设置为0
        a[m - 1] = 0;
    
        int z, x, c, v, b1, b2;
        int i = n + 1, j = n + 1, w[i][j];
    
        for (z = 1; z <= m; z++) {
            if (a[z] == 0) {
                a[z] = 0; // 将当前元素设为0
                i = 0;
                j = 0;
                break;
            } else {
                if (i > n || j > n)
                    break;
            }
        }
    
        for (b1 = 1; b1 <= n; b1++) {
            for (b2 = 1; b2 <= n; b2++) {
                w[b1][b2] = 0;
                for (z = 1; z <= m && !a[z]; z++) {
                    if (a[z] != 0) {
                        a[z]--; // 如果当前位置不是0,则减去1
                        if (z == 1) a[z]--; // 特例排除
                        if (a[z] == 0) {
                            a[z] = 0;
                            i++;
                            j++;
                            for (c = 1; c <= m && !a[c]; c++) {
                                if (a[c] != 0) {
                                    a[c]--;
                                    if (c == 1) a[c]--; // 特例排除
                                    if (a[c] == 0) {
                                        a[c] = 0;
                                        j++;
                                        for (v = 1; v <= m && !a[v]; v++) {
                                            if (a[v] != 0) {
                                                a[v]--;
                                                if (v == 1) a[v]--; // 特例排除
                                                if (a[v] == 0) {
                                                    a[v] = 0;
                                                    j++;
                                                    w[b1][b2] = z;
                                                    b1--;
                                                    b2--;
                                                    break;
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    
        for (b1 = 1; b1 <= n; b1++) {
            for (b2 = 1; b2 <= n; b2++) {
                printf("%d ", w[b1][b2]);
            }
            printf("\n");
        }
    
        return 0;
    }
    

    现在,这个程序应该可以正常工作了。

    评论

报告相同问题?