1203: 做幻方
时间限制: 1 Sec 内存限制: 128 MB
提交: 1440 解决: 578
Apple最近迷上了做幻方,Apple还是个中高手,只要你说个奇数N就能把N*N的幻方做出来。其实你可以比他做得更好的。Apple总是画得很乱,而你可以利用程序排得很整齐_ 幻方的要求:每一行,每一列,还有两条斜线上数字的和都相等.
输入
每行一个奇数N(0< N < 30),输入0结束
输出
输入一个奇数,输出一个幻方,顺序参照样板输出;同一列的数右对齐,数与数用一个空格分开;输出完以后加一个回车。
样例输入 Copy
5
1
0
样例输出 Copy
11 18 25 2 9
10 12 19 21 3
4 6 13 20 22
23 5 7 14 16
17 24 1 8 15
1
#include
#include
#include
int sort(int n);// 解奇阶幻方的通用模块
// n 为阶数
// index 为起始标识
int main()
{int n;while (scanf("%d", &n), n != 0){sort(n);}return 0;
}int sort(int n)
{int i, x = 0, y = 0, j;int(*a)[n] = (int(*)[n])malloc(sizeof(int) * n * n); // int (*a)[n](指向由整型数据组成的数组的指针)x = n / 2; // 指向中间列y = 0;for (i = 1; i <= n * n; i++){a[y][x] = i; // 把1(或最小的数)放在第一行正中if (i % n == 0) // 排满n个?y++; // 下一行elsex++, y--; // 向右上方移动x = (x % n + n) % n; // ?y = (y % n + n) % n; // ?}
/* 奇数阶幻方
最经典的填法是罗伯特法(楼梯法),填写方法是这样:
把1(或最小的数)放在第一行正中;按以下规律排列剩下的n×n-1个数:
(1)每一个数放在前一个数的右上一格;
(2)如果这个数所要放的格已经超出了顶行那么就把它放在底行,
仍然要放在右一列;
(3)如果这个数所要放的格已经超出了最右列那么就把它放在最左列,
仍然要放在上一行;
(4)如果这个数所要放的格已经超出了顶行且超出了最右列,
那么就把它放在前一个数的下一行同一列的格内;
(5)如果这个数所要放的格已经有数填入,处理方法同(4)。
这种写法总是先向“右上”的方向,象是在爬楼梯。
三阶幻方:8 1 63 5 74 9 2 */int fmt = log10(n * n); // 取位数? if (fmt == 0) // 这里的 fmt 值和 printf 中的 %d 对应{for (i = n - 1; i >= 0; i--){for (j = 0; j < n - 1; j++) // 从下往上排{printf("%d ", a[i][j]);}printf("%d", a[i][n - 1]); // 每行最后一个不输出空格printf("\n");}}else if (fmt == 1) // 这里的 fmt 值和 printf 中的 %d 对应{for (i = n - 1; i >= 0; i--){for (j = 0; j < n - 1; j++){printf("%2d ", a[i][j]);}printf("%2d", a[i][n - 1]);printf("\n");}}else if (fmt == 2) // 这里的 fmt 值和 printf 中的 %d 对应{for (i = n - 1; i >= 0; i--){for (j = 0; j < n - 1; j++){printf("%3d ", a[i][j]);}printf("%3d", a[i][n - 1]);printf("\n");}}free(a);printf("\n");return 0;
}
奇数阶幻方是阶数为奇数的幻方
最经典的填法是罗伯法(楼梯法)
首先 把1(或最小的数)放在第一行正中;
按以下规律排列剩下的(n×n-1)个数,
具体步骤为:
(1)每一个数放在前一个数的右上一格;
(2)如果这个数所要放的格已经超出了顶行那么
就把它放在底行,仍然要放在右一列;
(3)如果这个数所要放的格已经超出了最右列
那么就把它放在最左列,仍然要放在上一行;
(4)如果这个数所要放的格已经超出了顶行
且超出了最右列,那么就把它放在底行且最左列;
(5)如果这个数所要放的格已经有数填入,
那么就把它放在前一个数的下一行同一列的格内。
一群指针和一个指针的鉴别
int *a[n]( 由返回整型数据的指针所组成的数组 )
1.指针数组;每n个元素全为指针的数组.
2.a是一个指针数组,每一个指向一个int型理解记忆: 是指针数组, 有 n 个成员,每个成员都是一个指针,共有n个指针int (*b)[n]( 指向由整型数据组成的数组的指针 )
1.数组指针;指针类型是 int [n]类型的数组.指向n个元素组成的数组的一个指针。
2.b是一个指针,指向int[n]的数组。理解记忆:小括号优先,所以 是 1个指针,用来指向 有n个元素的数组。结合优先级:
[]的优先级比*的优先级高
对取模的认识还不够,数学知识,急需弥补,高数也要加油!
上一篇:公共命名空间和unicode
下一篇:GBase xdm查询条件要求