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

  • 相关阅读:
    Python的17种骚操作
    Python使用pip下载慢的原因
    Mysql数据库的安装
    Python中遇到的难解的提示:
    Linux使用SecureCRT远程终端工具的使用
    Linux下IP命令使用详解
    (未解决)jmeter报错之“请在微信客户端打开链接”
    Python学习笔记系列——九九乘法表&猜大小
    《Mysql必知必会》笔记
    (未解决)记录一次登录&jmeter,留下的一地鸡毛
  • 原文地址:https://www.cnblogs.com/lijianming180/p/12347416.html
Copyright © 2011-2022 走看看