5 条题解

  • 0
    @ 2025-11-30 17:07:12

    #include #include using namespace std; int main() { int n, m; cin >> n; // 输入幻方阶数(必须是奇数)

    int arry[40][40] = {0};  // 初始化30x30数组(最大支持29阶幻方)
    m = (n - 1) / 2;        // 计算中间位置(第1行中间列)
    
    int tempx = m, tempy = 0;  // 起始位置:[中间列][第0行]
    arry[tempx][tempy] = 1;    // 放置第一个数字1
    
    // 核心算法:按顺序填充2~n*n的数字
    for (int k = 2; k <= n * n; k++) {
        // 情况1:当前数字在第一行但不在最后一列
        if (tempx != n - 1 && tempy == 0) {
            tempx++;          // 移到最后一列
            tempy = n - 1;    // 移到最后一行
            arry[tempx][tempy] = k;
        }
        // 情况2:当前数字在最后一列但不在第一行
        else if (tempx == n - 1 && tempy != 0) {
            tempx = 0;        // 移到第一列
            tempy--;          // 移到上一行
            arry[tempx][tempy] = k;
        }
        // 情况3:当前数字在第一行最后一列(右上角)
        else if (tempx == n - 1 && tempy == 0) {
            tempy++;          // 直接下移一行
            arry[tempx][tempy] = k;
        }
        // 情况4:当前数字在中间位置
        else {
            // 尝试右上方位置(行减1,列加1)
            if (arry[tempx + 1][tempy - 1] == 0) {  // 右上方为空
                tempx++;
                tempy--;
                arry[tempx][tempy] = k;
            } else {  // 右上方已有数字
                tempy++;  // 直接下移一行
                arry[tempx][tempy] = k;
            }
        }
    }
    
    // 打印幻方(注意:按行输出,arry[列][行])
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            cout << arry[j][i] << " ";  // 列j, 行i
        }
        cout << endl;
    }
    return 0;
    

    }

    • 0
      @ 2025-11-30 17:02:48

      幻方生成规则详解(小朋友版): 起始位置:把数字1放在第一行的正中间

      移动规则(就像走格子游戏):

      总是尝试往"右上方"走一步(行减1,列加1)

      遇到特殊情况时调整位置:

      如果走到"天花板"(第一行),就跳到"地板"(最后一行),列不变

      如果走到"右墙"(最后一列),就跳到"左墙"(第一列),行不变

      如果走到右上角,就直直往下走

      如果右上方格子被占了,就直直往下走

      数字摆放:按顺序把数字放进走到的格子里

      例子(3阶幻方): text 输入:3 输出:

      8 1 6

      3 5 7

      4 9 2

      神奇之处:每行/每列/对角线之和都是15!

      学习提示: 数组arry[列][行]就像围棋棋盘,第一个坐标是x(横向),第二个是y(纵向)

      setw(3)让每个数字占3格空间,输出更整齐

      只能生成奇数阶幻方(输入偶数会出错哦!)

      #include <iostream>
      

      #include // 用于setw控制输出宽度 using namespace std;

      int main() { int n, m; cin >> n; // 输入幻方阶数(奇数) int arry[30][30] = {0}; // 初始化30x30数组全为0(最大支持29阶幻方)

      // 计算第一行中间位置的列索引(幻方规则起始点)
      m = (n - 1) / 2; // 因为数组索引从0开始
      int tempx = m;    // 初始列位置(中间列)
      int tempy = 0;    // 初始行位置(第一行)
      
      arry[tempx][tempy] = 1; // 将数字1放在第一行中间列
      
      // 从数字2开始填充到n*n
      for (int k = 2; k <= n * n; k++)
      {
          // 情况1:当前位置在第一行但不在最后一列
          if (tempy == 0 && tempx != n - 1) {
              tempx += 1;    // 移动到最后一列
              tempy = n - 1; // 移动到最后一行
          }
          // 情况2:当前位置在最后一列但不在第一行
          else if (tempx == n - 1 && tempy != 0) {
              tempx = 0;     // 移动到第一列
              tempy -= 1;    // 移动到上一行
          }
          // 情况3:当前位置在第一行最后一列(右上角)
          else if (tempy == 0 && tempx == n - 1) {
              tempy += 1;    // 直接向下移动一行(列不变)
          }
          // 情况4:当前位置在中间区域(不在边界)
          else {
              // 尝试移动到右上方格子(行减1,列加1)
              if (arry[tempx + 1][tempy - 1] == 0) {
                  tempx += 1;  // 向右移动一列
                  tempy -= 1; // 向上移动一行
              }
              // 右上方已有数字则直接向下移动
              else {
                  tempy += 1; // 向下移动一行(列不变)
              }
          }
          arry[tempx][tempy] = k; // 将当前数字放入新位置
      }
      
      // 打印幻方(按行输出)
      for (int i = 0; i < n; i++) {
          for (int j = 0; j < n; j++) {
              cout << setw(3) << arry[j][i]; // 每个数字占3个字符宽度
          }
          cout << endl; // 每行结束换行
      }
      return 0;
      

      }

      • -1
        @ 2025-8-1 17:25:32

        sbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsb

        • -2
          @ 2025-8-1 17:24:20

          看题解眉目

          • -2
            @ 2025-8-1 17:23:01

            你看你妈呢?

            • 1

            【深基5.例9】[NOIP2015 提高组] 神奇的幻方

            信息

            ID
            728
            时间
            1000ms
            内存
            256MiB
            难度
            10
            标签
            递交数
            7
            已通过
            2
            上传者