• C++求解N阶幻方


    由一道数学题的联想
    然后根据网上的做法瞎jb乱打了一下,居然对了
    代码精心附上了注释,有兴趣的童鞋可以看一看。。
    不说了,上代码!(自认为结构很清晰易懂)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171

    #include <cstdlib>
    #include <cmath>
    #include <cstdio>
    #define MAXN 10000
    using namespace std;

    int matrix[MAXN][MAXN] = { 0 };

    void (int n)
    {
    int x = 0, y, mun = 1;
    y = n / 2;
    while (mun <= n * n)
    {
    matrix[x][y] = mun;

    //通过x0、y0检测右上的是否已经填入数字
    int x0 = x;
    int y0 = y;
    x0--;
    y0++;
    //超界处理
    if (x0 < 0)
    x0 += n;
    if (y0 == n)
    y0 = n - y0;
    if (!matrix[x0][y0])
    {
    x = x0;
    y = y0;
    }
    else
    {
    //若有数字填入之前数字的下方
    x++;
    if (x == n) x = 0;
    }
    mun++;
    }
    }


    //生成双偶幻方
    void CreateDoubleEvenMagicSqure(int n)
    {
    int num = 1;
    //从1到n的平方依次赋值
    for (int i = 0; i<n; i++)
    for (int j = 0; j<n; j++)
    matrix[i][j] = num++;

    //小正方形的对角线上的数字取其补数
    for (int i = 0; i < n; i++)
    for (int j = 0; j < n; j++)
    {
    if (i % 4 == 0 && 大专栏  C++求解N阶幻方an class="built_in">abs(i - j) % 4 == 0)
    for (int k = 0; k<4; k++)
    matrix[i + k][j + k] = abs(n * n + 1 - matrix[i + k][j + k]);
    else if (i % 4 == 3 && (i + j) % 4 == 3)
    for (int k = 0; k<4; k++)
    matrix[i - k][j + k] = abs(n * n + 1 - matrix[i - k][j + k]);

    }
    }


    //生成单偶幻方
    void CreateSingleEvenMagicSqure(int n)
    {
    int k = n / 2;
    CreateOddMagicSquare(k);
    //赋初值,左上最小,右下其次,右上再次,左下最大
    for (int i = 0; i < k; i++)
    for (int j = 0; j < k; j++)
    {
    matrix[i + k][j + k] = matrix[i][j] + k * k;
    matrix[i][j + k] = matrix[i][j] + k * k * 2;
    matrix[i + k][j] = matrix[i][j] + k * k * 3;
    }
    //公式 n=4m+2
    int m = (n - 2) / 4;
    //交换x方向正中行的从左至右m-1个
    for (int i = 0; i<m - 1; i++)
    {
    int buf = matrix[k / 2][i];
    matrix[k / 2][i] = matrix[k / 2 + k][i];
    matrix[k / 2 + k][i] = buf;
    }
    int buf = matrix[k / 2][k / 2];
    //以及正中间的数
    matrix[k / 2][k / 2] = matrix[k / 2 + k][k / 2];
    matrix[k / 2 + k][k / 2] = buf;

    //交换除x正中间行的其他行对应数字m个
    for (register int i = 0; i<k; i++)
    for (register int j = 0; j<k / 2; j++)
    {
    if (i != k / 2)
    {
    int buf = matrix[i][j];
    matrix[i][j] = matrix[i + k][j];
    matrix[i + k][j] = buf;
    }
    }

    //交换最右边m-1个数字
    for (register int i = 0; i < k; i++)
    for (register int j = n - 1; j > n - 1 - (m - 1); j--)
    swap(matrix[i][j], matrix[i + k][j]);


    }
    bool Check(int n)
    {
    int sum = (n*(n*n + 1)) / 2;
    int SumA = 0, SumB = 0;

    for (int i = 0; i < n; i++)
    {
    for (int j = 0; j < n; j++)
    SumA += matrix[i][j];
    if (SumA != sum)
    return false;
    SumA = 0;
    }

    for (int i = 0; i < n; i++)
    {
    for (int j = 0; j < n; j++)
    SumA += matrix[j][i];
    if (SumA != sum)
    return false;
    SumA = 0;
    }

    for (int i = 0; i<n; i++)
    {
    SumA += matrix[i][i];
    SumB += matrix[i][n - i - 1];
    }
    if (SumA != sum || SumB != sum)
    return false;

    return true;

    }

    int main()
    {
    int n;
    cin >> n;
    if (n % 2 != 0)
    CreateOddMagicSquare(n);
    else if (n % 4 == 0)
    CreateDoubleEvenMagicSqure(n);
    else if (n % 2 == 0)
    CreateSingleEvenMagicSqure(n);

    for (int i = 0; i<n; i++)
    {
    for (int j = 0; j<n; j++)
    cout << matrix[i][j] << "t";
    cout << endl;
    }

    if (!Check(n))
    cout << "Failed to generate!" << endl;
    getchar(), getchar();
    return 0;
    }

  • 相关阅读:
    选择主要的构建实践方法(转) Tech
    201671010109 201620172《java程序设计》第一周感想
    201671010109 201720162第二周学习感想
    2016710101090 20162017《java程序设计》第三周感想
    sort k 详解
    java.util.NoSuchElementException: None.get的解决方法
    Configuration problem: Unable to locate Spring NamespaceHandler for XML schema namespace 解决方法
    Java学习随笔之1: Java 语言概述和开发环境
    java 学习随笔之2:理解面向对象
    Selenium Basic Knowledge
  • 原文地址:https://www.cnblogs.com/lijianming180/p/12347416.html
Copyright © 2020-2023  润新知