zoukankan      html  css  js  c++  java
  • 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;
    }

  • 相关阅读:
    map集合的见解、排序
    java mysql 数据类型对照
    spring 通过@Value 获取properties文件中设置了属性 ,与@Value # 和$的区别
    nginx中的超时设置,请求超时、响应等待超时等
    Linux配置多个Tomcat同时运行
    Socket TCP Server一个端口可以有多少个长连接?受到什么影响?linux最大文件句柄数量总结
    tomcat关闭后线程依然运行解决办法
    守护线程与非守护线程的区别
    SSM整合——spring4.*配置案例
    SSM事务——事务回滚如何拿到返回值
  • 原文地址:https://www.cnblogs.com/lijianming180/p/12347416.html
Copyright © 2011-2022 走看看