递归求九宫程序看不懂。有人帮忙讲解一下吗?

toddfsy 2008-07-14 04:34:53
递归求九宫程序看不懂。有人帮忙讲解一下吗?


#include<stdio.h>
#define MAX 9

int IsElement(int a[], int len, int x);
void F(int a[], int len);

int main()
{
int a[MAX] = {0};
/*int i;*/

for (a[0]=1; a[0]<=MAX; a[0]++)
{
F(a, 0);
}

getchar();
return 0;
}

void F(int a[], int len)//以递归代替多重嵌套循环
{
int i;
if (len < MAX-2 && IsElement(a, len, a[len]))
{
len++;
for (a[len]=1; a[len]<=9; a[len]++)
{
F(a, len);
}
}
else if (len == MAX-2)
{
a[8] = 45-a[0]-a[1]-a[2]-a[3]-a[4]-a[5]-a[6]-a[7];
if ((a[0]+a[1]+a[2]) == (a[3]+a[4]+a[5]) && (a[0]+a[1]+a[2]) == (a[6]+a[7]+a[8])
&& (a[0]+a[3]+a[6]) == (a[1]+a[4]+a[7]) && (a[0]+a[3]+a[6]) == (a[2]+a[5]+a[8])
&& (a[0]+a[1]+a[2]) == (a[0]+a[4]+a[8]) && (a[0]+a[1]+a[2]) == (a[2]+a[4]+a[6]))
{
for (i=0; i<9; i++)
{
printf("%5d", a[i]);
if ((i+1)%3 == 0)
printf("\n");
}
printf("\n\n");
}
}
}

int IsElement(int a[], int len, int x)
{
int i;
for (i=0; i<len; i++)
{
if (a[i] == x)
return 0;
}

return 1;
}
...全文
107 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
cqqqq 2008-07-15
  • 打赏
  • 举报
回复
谁写个偶阶幻方来看下,或者帖个来看下
cqqqq 2008-07-14
  • 打赏
  • 举报
回复
通过总结以上规律,我另给一个^_^
#include <iostream>
void main()
{
//int K,n,i,j;
//scanf("%d",&n);
//K=(5*n-1)/2; //这里计算出来的K代表什么?
//for(i=0;i<n;i++,K--,printf("\n"))
// for(j=0;j<n;j++)
// printf("%d ",(K+j)%n*n+(K-j-1)%n+1); //这里的计算实在是看不懂
// system("pause");

int num;
scanf("%d",&num);
int low=(num-1)/2;
int high=(num+1)/2;
for(int j=0;j<num;j++)
{
for(int i=0;i<num;i++)
{
printf("%d ",(i*high+j*high)%num*num+(low+low*i+j*high)%num+1);
}
printf("\n");
}
system("pause");

}
/*
观察以上代码的结果,不难发现,只能处理输入为奇数的情况,
说明只能运算奇阶幻方
若输入的为n
从中下的1开始,往左上走,每走一步值+2,走(n+1)/2次
再从1的上边继续走,同样的走法,走(n-1)/2次
然后下次再在上次起点的右边,继续走,同样的走法,走(n+1)/2步
然后下次再在上次起点的上边,继续走,同样的走法,走(n+1)/2步
....
2从右边中间的上边一个点开始,类似的规律

把这些规律,简化成公式后,可以得到代码的表达式.

再分析每行数据显然:
有n-1次+(n-1),有一次+(2*n-1),当数据大于n*n时-n*n,

另法:

在第一行居中的方格内放1,依次向左上方填入2、3、4…,如果左上方已有数字,
则向下移一格继续填写。如下图用Merziral法生成的5阶幻方:

17 24 1 8 15 向右+7+7+2+7 +2
23 5 7 14 16 向下 +1+6+6+6+6
4 6 13 20 22
10 12 19 21 3
11 18 25 2 9

另法:
1
2 6
3-----7------11
4 | 8 12 | 16
5 9 13 17 21
10 | 14 18 | 22
15----19----23
20 24
25


3 20 7 24 11 向右+17(-8) : +12(-13)
16 8 25 12 4 向下 +13(-12) : +18(-7)
9 21 13 5 17
22 14 1 18 10
15 2 19 6 23

*/
newlist006 2008-07-14
  • 打赏
  • 举报
回复
神人
cqqqq 2008-07-14
  • 打赏
  • 举报
回复
#include <stdio.h>
void main()
{
int K,n,i,j;
scanf("%d",&n);
K=(5*n-1)/2; //这里计算出来的K代表什么?
for(i=0;i<n;i++,K--,printf("\n"))
for(j=0;j<n;j++)
printf("%d ",(K+j)%n*n+(K-j-1)%n+1); //这里的计算实在是看不懂
}
/*
观察以上代码的结果,不难发现,只能处理输入为奇数的情况,
说明只能运算奇阶幻方
若输入的为n
从中下的1开始,往左上走,每走一步值+2,走(n+1)/2次
再从1的上边继续走,同样的走法,走(n-1)/2次
然后下次再在上次起点的右边,继续走,同样的走法,走(n+1)/2步
然后下次再在上次起点的上边,继续走,同样的走法,走(n+1)/2步
....
2从右边中间的上边一个点开始,类似的规律

把这些规律,简化成公式后,可以得到代码的表达式.
*/
hai040 2008-07-14
  • 打赏
  • 举报
回复
1l那程序没必要搞懂的
只要知道有这样一条公式就行,反正是不大可能记得住
toddfsy 2008-07-14
  • 打赏
  • 举报
回复
ddddddddddddd
hai040 2008-07-14
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 toddfsy 的回复:]
还有这个也不知道啥意思

C/C++ code
#include <stdio.h>
void main()
{
int K,n,i,j;
scanf("%d",&n);
K=(5*n-1)/2; //这里计算出来的K代表什么?
for(i=0;i<n;i++,K--,printf("\n"))
for(j=0;j<n;j++)
printf("%d ",(K+j)%n*n+(K-j-1)%n+1); //这里的计算实在是看不懂
}
[/Quote]
这个太强大了
hai040 2008-07-14
  • 打赏
  • 举报
回复
等于7嵌套循环,填a[1]-a[7]
toddfsy 2008-07-14
  • 打赏
  • 举报
回复
还有这个也不知道啥意思

#include <stdio.h>
void main()
{
int K,n,i,j;
scanf("%d",&n);
K=(5*n-1)/2; //这里计算出来的K代表什么?
for(i=0;i<n;i++,K--,printf("\n"))
for(j=0;j<n;j++)
printf("%d ",(K+j)%n*n+(K-j-1)%n+1); //这里的计算实在是看不懂
}

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧