每日一题!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 编辑 ]