[蓝桥省题](C2013_4) 幻方填空

4、(幻方填空)幻方是把一些数字填写在方阵中,使得行、列、两条对角线的数字之和都相等,欧洲著名的幻方是德国数学家、画家迪勒创作版画《忧郁》中给出的一个4阶幻方

他把1、2、3、...、16这16个数字填写在4*4的方格中,如下如所示:

img

表中有些数字已经显露出来,还有些用?和代替,请你计算出?和所代表的数字,并把*所代表的数字作本题的答案提交。

本题是一个整数,请通过浏览器直接提交该数字,不要提交解答过程、或其他辅助说明类的内容。

题意:图片上已经有了1,9,11,13,15,16五个数,我们就需要找到剩下的十个数字能让四行之和相等、四列之和相等、两斜×相等的序列

思路:因为是一道填空题,我们不需要考虑其性能,我们可以剩下的十个数字进行全排列,然后每次都把序列送入判断函数内让他们相加来判断,直到得到符合条件的序列后,输出第2行3列的值即可

int Judge(int* nums)
{
    int Matrix[4][4];
    Matrix[0][0] = 16;
    Matrix[0][1] = nums[0];
    Matrix[0][2] = nums[1];
    Matrix[0][3] = 13;
    Matrix[1][0] = nums[2];
    Matrix[1][1] = nums[3];
    Matrix[1][2] = 11;
    Matrix[1][3] = nums[4];
    Matrix[2][0] = 9;
    Matrix[2][1] = nums[5];
    Matrix[2][2] = nums[6];
    Matrix[2][3] = nums[7];
    Matrix[3][0] = nums[8];
    Matrix[3][1] = 15;
    Matrix[3][2] = nums[9];
    Matrix[3][3] = 1;

    int r1 = Matrix[0][0] + Matrix[0][1] + Matrix[0][2] + Matrix[0][3];
    int r2 = Matrix[1][0] + Matrix[1][1] + Matrix[1][2] + Matrix[1][3];
    int r3 = Matrix[2][0] + Matrix[2][1] + Matrix[2][2] + Matrix[2][3];
    int r4 = Matrix[3][0] + Matrix[3][1] + Matrix[3][2] + Matrix[3][3];

    int l1 = Matrix[0][0] + Matrix[1][0] + Matrix[2][0] + Matrix[3][0];
    int l2 = Matrix[0][1] + Matrix[1][1] + Matrix[2][1] + Matrix[3][1];
    int l3 = Matrix[0][2] + Matrix[1][2] + Matrix[2][2] + Matrix[3][2];
    int l4 = Matrix[0][3] + Matrix[1][3] + Matrix[2][3] + Matrix[3][3];

    int x1 = Matrix[0][0] + Matrix[1][1] + Matrix[2][2] + Matrix[3][3];
    int x2 = Matrix[0][3] + Matrix[1][2] + Matrix[2][1] + Matrix[3][0];

    if (r1 == r2 && r2 == r3 && r3 == r4 && l1 == l2 && l2 == l3 && l3 == l4 && x1 == x2) {
        printf("%d", Matrix[2][3]);
        return 1;
    }
    else
        return 0;
}
int main()
{
    int nums[10] = { 2,3,4,5,6,7,8,10,12,14 };
    int nums2[10];
  //全排列枚举
    for (int a = 0; a < 9; a++)
    {
        for (int b = 0; b < 10; b++)
            if (nums[a] != nums[b])
                for (int c = 0; c < 10; c++)
                    if (nums[c] != nums[a] && nums[c] != nums[b])
                        for (int d = 0; d < 10; d++)
                            if (nums[d] != nums[a] && nums[d] != nums[b] && nums[d] != nums[c])
                                for (int e = 0; e < 10; e++)
                                    if (nums[e] != nums[a] && nums[e] != nums[b] && nums[e] != nums[d] && nums[e] != nums[c])
                                        for (int f = 0; f < 10; f++)
                                            if (nums[f] != nums[a] && nums[f] != nums[b] && nums[f] != nums[c] && nums[f] != nums[d] && nums[f] != nums[e])
                                                for (int g = 0; g < 10; g++)
                                                    if (nums[g] != nums[a] && nums[g] != nums[b] && nums[g] != nums[c] && nums[g] != nums[d] && nums[g] != nums[e] && nums[g] != nums[f])
                                                        for (int h = 0; h < 10; h++)
                                                            if (nums[h] != nums[a] && nums[h] != nums[b] && nums[h] != nums[c] && nums[h] != nums[d] && nums[h] != nums[e] && nums[h] != nums[f] && nums[h] != nums[g])
                                                                for (int i = 0; i < 10; i++)
                                                                    if (nums[i] != nums[a] && nums[i] != nums[b] && nums[i] != nums[c] && nums[i] != nums[d] && nums[i] != nums[e] && nums[i] != nums[f] && nums[i] != nums[g] && nums[i] != nums[h])
                                                                        for (int j = 0; j < 10; j++)
                                                                            if (nums[j] != nums[a] && nums[j] != nums[b] && nums[j] != nums[c] && nums[j] != nums[d] && nums[j] != nums[e] && nums[j] != nums[f] && nums[j] != nums[g] && nums[j] != nums[h] && nums[j] != nums[i])
                                                                            {

                                                                                nums2[0] = nums[a];
                                                                                nums2[1] = nums[b];
                                                                                nums2[2] = nums[c];
                                                                                nums2[3] = nums[d];
                                                                                nums2[4] = nums[e];
nums2[5] = nums[f]                                                                    nums2[6] = nums[g];
nums2[7] = nums[h];                                                                    nums2[8] = nums[i];                                                                    nums2[9] = nums[j];
if (Judge(nums2)) {                                                                system("pause")
 return 0;                                                                            }
                                                         }
    
}              
}

C语言全排列函数代码如下(数据大的话得超时)

int Judge(int* nums)
{
    int Matrix[4][4];
    Matrix[0][0] = 16;
    Matrix[0][1] = nums[0];
    Matrix[0][2] = nums[1];
    Matrix[0][3] = 13;
    Matrix[1][0] = nums[2];
    Matrix[1][1] = nums[3];
    Matrix[1][2] = 11;
    Matrix[1][3] = nums[4];
    Matrix[2][0] = 9;
    Matrix[2][1] = nums[5];
    Matrix[2][2] = nums[6];
    Matrix[2][3] = nums[7];
    Matrix[3][0] = nums[8];
    Matrix[3][1] = 15;
    Matrix[3][2] = nums[9];
    Matrix[3][3] = 1;

    int r1 = Matrix[0][0] + Matrix[0][1] + Matrix[0][2] + Matrix[0][3];
    int r2 = Matrix[1][0] + Matrix[1][1] + Matrix[1][2] + Matrix[1][3];
    int r3 = Matrix[2][0] + Matrix[2][1] + Matrix[2][2] + Matrix[2][3];
    int r4 = Matrix[3][0] + Matrix[3][1] + Matrix[3][2] + Matrix[3][3];

    int l1 = Matrix[0][0] + Matrix[1][0] + Matrix[2][0] + Matrix[3][0];
    int l2 = Matrix[0][1] + Matrix[1][1] + Matrix[2][1] + Matrix[3][1];
    int l3 = Matrix[0][2] + Matrix[1][2] + Matrix[2][2] + Matrix[3][2];
    int l4 = Matrix[0][3] + Matrix[1][3] + Matrix[2][3] + Matrix[3][3];

    int x1 = Matrix[0][0] + Matrix[1][1] + Matrix[2][2] + Matrix[3][3];
    int x2 = Matrix[0][3] + Matrix[1][2] + Matrix[2][1] + Matrix[3][0];

    if (r1 == r2 && r2 == r3 && r3 == r4 && l1 == l2 && l2 == l3 && l3 == l4 && x1 == x2) {
        printf("%d", Matrix[2][3]);
        return 1;
    }
    else
        return 0;
}
void swap(int* a, int* b)
{
    int temp = *a;
    *a = *b;
    *b = temp;
}
void Allarrange(int* nums, int k, int len)
{
    int i;
    if (k == len)
    {
        if(Judge(nums)) return;
    }
    else
    {
        for (int i = k; i <= len; i++)
        {
            swap(nums + i, nums + k);
            Allarrange(nums, k + 1, len);
            swap(nums + i, nums + k);
        }
    }
}


int main()
{
    int nums[10] = { 2,3,4,5,6,7,8,10,12,14 };
    int len = (sizeof(nums) / sizeof(nums[0]));
    Allarrange(nums, 0, len);
    system("pause");
    return 0;
}

教学视频如下所示:

<video controls="" src="https://axuannote-1304271763.cos.ap-nanjing.myqcloud.com/%E8%93%9D%E6%A1%A52013_4.mp4";></video>

本文链接:

https://nullcode.fun/93.html
1 + 3 =
快来做第一个评论的人吧~