鱼C论坛

 找回密码
 立即注册
查看: 1980|回复: 1

罗伯法解奇数阶幻方

[复制链接]
发表于 2024-9-3 06:16:17 | 显示全部楼层
看起来你正在尝试用C语言实现罗伯法(又称“幻方法”)来生成奇数阶幻方。不过你的代码在某些地方有问题,下面是一些需要修正的点:

1. **包含头文件**:确保`#include <stdio.h>`在代码开头,因为你使用了输入输出函数。

2. **二维数组声明**:定义二维数组时,你应该用正确的语法声明,并指定大小。
   
3. **初始化数组**:声明数组时不能用`int a = {0};`,因为这只是一个不完整的初始化。应该声明`int a[n][n];`并初始化。

4. **填充逻辑**:你提到的代码只展示了一部分,可以根据罗伯法的规则进行填充。

以下是更完整的代码示例:

  1. #include <stdio.h>

  2. int main() {
  3.     int n, num = 1, lon, wei;
  4.    
  5.     printf("n = ");
  6.     scanf("%d", &n);
  7.    
  8.     int a[n][n]; // 声明一个n x n的二维数组
  9.     for(int i = 0; i < n; i++) {
  10.         for(int j = 0; j < n; j++) {
  11.             a[i][j] = 0; // 初始化所有元素为0
  12.         }
  13.     }

  14.     lon = 0;
  15.     wei = n / 2;

  16.     while(num <= n * n) {
  17.         a[lon][wei] = num;
  18.         num++;
  19.         
  20.         int new_lon = (lon - 1 + n) % n;
  21.         int new_wei = (wei + 1) % n;

  22.         if(a[new_lon][new_wei] != 0) {
  23.             lon = (lon + 1) % n;
  24.         } else {
  25.             lon = new_lon;
  26.             wei = new_wei;
  27.         }
  28.     }
  29.    
  30.     // 打印出幻方
  31.     for(int i = 0; i < n; i++) {
  32.         for(int j = 0; j < n; j++) {
  33.             printf("%4d", a[i][j]);
  34.         }
  35.         printf("\n");
  36.     }
  37.    
  38.     return 0;
  39. }
复制代码


**解释:**
- **当前位置原则**:从矩阵的最上行中间一列开始。
- **移动位置**:将数字按顺序填入当前位置,然后向右上方移动。如果移动的位置已经被占用或出界,则向下移动一格。
- 确保每次移动时,使用`% n`操作符处理数组边界,使其循环。

这个方法仅适用于奇数阶的幻方。希望这能帮助你理解并解决问题!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2026-4-2 03:37

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表