69,382
社区成员
发帖
与我相关
我的任务
分享
#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;
}
#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
*/
#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从右边中间的上边一个点开始,类似的规律
把这些规律,简化成公式后,可以得到代码的表达式.
*/
#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); //这里的计算实在是看不懂
}