魔方构造问题

《数据结构(C语言版)》学习笔记:魔方构造算法(p23)

1. 魔方产生法则

把1放入第一行最中间的方格中,向左上方移动,并按照数字的递增顺序,把数字填入空方格。如果移出了魔方(即越过了魔方边界),则进入魔方对边的对应方格,继续填写方格。如果一个方格已被填入数字,则向下继续填入方格。

2. 魔方构造算法C语言实现

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
int magic_square(int square[][MAX_SIZE], int size)
{
int row, col;
int i, j, count;
if (size<1 || size>MAX_SIZE)
return 1;
if (size % 2 == 0)
return 2;
for (i = 0; i < size; i++) //魔方每个元素初始化为0
for (j = 0; j < size; j++)
square[i][j] = 0;
i = 0; j = (size - 1) / 2;
square[i][j] = 1;//将1放入第一行最中间的方格中
for (count = 2; count <= size*size; count++)//依次放入2,3,...,size*size
{
row = (i - 1 >= 0) ? (i - 1) : (size - 1);//寻找下一个位置
col = (j - 1 >= 0) ? (j - 1) : (size - 1);
if (square[row][col])//下一个位置已被填入数字
i = (++i) % size;//数字填写到下一个位置之前一个位置的正下方
else //下一个位置没有被填入数字
{
i = row; //数字填写到下一个位置
j = col;
}
square[i][j] = count;
}
return 0;
}


3. i,jrow,col的作用分析

4. 测试主函数

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
#include<stdio.h>
#include<stdlib.h>
#define MAX_SIZE 15
int magic_square(int square[][MAX_SIZE], int size);
void print_square(int square[][MAX_SIZE], int size);
int main()
{
int square[MAX_SIZE][MAX_SIZE];
int size;
printf("Enter the size of the square:");
scanf_s("%d", &size);
int flag=magic_square(square, size);
if (flag == 1)
fprintf(stderr, "Error! Size is out of range.\n");
else if (flag==2)
fprintf(stderr, "Error! Size is even.\n");
else{
printf("Magic Square of size %d :\n\n", size);
print_square(square, size);
}
printf("\n");
system("pause");
return 0;
}
void print_square(int square[][MAX_SIZE], int size)
{
for (int i = 0; i < size; i++)
{
for (int j = 0; j < size; j++)
printf("%5d", square[i][j]);
printf("\n");
}
}


本文标题:魔方构造问题

文章作者:wuxubj

发布时间:2016年06月30日 - 12:06

最后更新:2017年05月03日 - 10:05

原始链接:http://www.wuxubj.cn/2016/06/magic-square-generate/

许可协议: Attribution-NonCommercial 4.0 转载请保留原文链接及作者。

扫二维码
扫一扫,用手机访问本站

扫一扫,用手机访问本站