TB椰程 TypeBuddy 打字搭子

神奇的幻方

洛谷·深入浅出 · 代码 · cpp · 难度 4/5 · 共 661 字

奇数阶幻方的罗伯法构造

  • 洛谷
  • 例题

正文

// 原题:https://oj.yecheng.tv/p/1401
// 题意:按罗伯法构造 N×N(N 奇数<=39)幻方并输出。
// 思路:1 放首行中间;之后 (K-1) 在第一行非末列→放最后一行右一列;末列非首行→放首列上一行;首行末列→正下方;否则右上若空放右上,否则正下方。
// 复杂度:O(N^2)。
// 易错点:严格按四种位置关系放置;越界用取模回绕。
#include <iostream>
using namespace std;
int main(){
    int n, m[40][40] = {0};
    cin >> n;
    int r = 0, c = n / 2;
    for(int k = 1; k <= n * n; k++){
        m[r][c] = k;
        int nr = (r - 1 + n) % n, nc = (c + 1) % n;
        if(m[nr][nc] != 0){ nr = (r + 1) % n; nc = c; }
        r = nr; c = nc;
    }
    for(int i = 0; i < n; i++){
        for(int j = 0; j < n; j++) cout << m[i][j] << (j < n - 1 ? " " : "");
        cout << endl;
    }
    return 0;
}

洛谷·深入浅出的其它内容

打字首页 · 词库画廊 · 编程打字 · 指法入门 · 天梯榜 · 数据分析 · 班级课堂 · 关于我们
椰程 TypeBuddy 打字搭子 —— 键盘指法练习 · 单词记忆 · 班级课堂 · 在线 PK