每日一题!NO.3(适合新手做练习)-幻方问题(已经给出答案!)
简单问题:所谓幻方,就是一个N行N列的正方型,当N为奇数时,称为奇数阶幻方。共有N的平方个格子,将1.2.3.....。N的平方这些数字方到这些格子里,使其每行的和,每列的和及两条对角线的和都是一个相同的数。试编程由键盘输入一个奇数N,输出一个N阶幻方。
请写上注释!
答案明日公布;

算法下面的朋友都给出来,其实其他的七种算法可以让已经得到的表格,旋转和对折后再分析算法,但决不是左上或右上这么少,还可以是左下,右下,当然第一个数字的位置也可以变的,可以分析哈,当练习分析能力。
给数的数据,由于排版问题,输入数字大了,就会自动移动到下一行会迫害排版,所以,好输入3以上的输出结果还好自己排版才能更好的观看输出结果!
程序代码:#include<stdio.h>
#include<stdlib.h>
void main()
{
int i=0,j,k=1,iold,jold,n,nn[50][50]={0};//定义自变量
printf("请输入奇数\n");
scanf("%d",&n);
if(n%2!=1)//验证输入是不是奇数
{
printf("输入的不是奇数\n");
getchar();
exit(0);
}
j=n/2;
for(;k<=n*n;k++)//循环添加数字,每下一个数在原来的基础上加1“k++”
{
nn[i][j]=k;//填数字在表格里
iold=i;//记录这次添数字表格的坐标
jold=j;//
i=i-1;//向右上移动一格
j=1+j;//
if(i<0&&j<n)//判断行是否益处表格,如果益处了,就变成最下行坐标,
{
i=n-1;
}
else if(i<0&&j>=n) /*判断行和列是否同时益处表格,如果益处了,行变为最下行坐标,
列变为最左边坐标*/
{
i=n-1;
j=0;
}
else if(i>=0&&j>=n)//判断列是否单独益处表格,如果益处则变为最左边坐标
{
j=0;
}
if(nn[i][j]>0)//判断移动后的表格是否已经填入了数据,如果填入了,就不向右上移动,向下移动
{
i=iold+1; //在记录上次的坐标向下移动一个表格
j=jold;
}
}
printf("______________________________\n 第1--4种\n\n");
for(i=0;i<n;i++)//按照把得到的表格旋转和对撤后,所得到新的7种,
{ //根据数组正序和倒序的排列输出可以实现
for(j=0;j<n;j++)
{
printf(" %2d",nn[i][j]);
}
printf(" \t");
for(j=n-1;j>=0;j--)
{
printf("%3d",nn[i][j]);
}
printf(" \t");
for(j=0;j<n;j++)
{
printf("%3d",nn[j][i]);
}
printf(" \t");
for(j=n-1;j>=0;j--)
{
printf("%3d",nn[j][i]);
}
printf("\n\n");
}
printf("______________________________\n 第5--8种\n\n");
for(i=n-1;i>=0;i--)
{
for(j=0;j<n;j++)
{
printf("%3d",nn[i][j]);
}
printf(" \t");
for(j=n-1;j>=0;j--)
{
printf("%3d",nn[i][j]);
}
printf(" \t");
for(j=0;j<n;j++)
{
printf("%3d",nn[j][i]);
}
printf(" \t");
for(j=n-1;j>=0;j--)
{
printf("%3d",nn[j][i]);
}
printf("\n\n");
}
printf("______________________________\n");
}[ 本帖最后由 啊C 于 2011-6-7 22:32 编辑 ]









不会做啊。。留名等答案~~强烈要求加注释。
