- 注册时间
- 2012-3-12
- 最后登录
- 1970-1-1
- 威望
- 星
- 金币
- 枚
- 贡献
- 分
- 经验
- 点
- 鲜花
- 朵
- 魅力
- 点
- 上传
- 次
- 下载
- 次
- 积分
- 265
- 在线时间
- 小时
|
发表于 2012-3-12 21:02:26
|
显示全部楼层
以前看了个生成幻方的程序,不知道谁写的,在给大家看一下(c++的)
#include<iostream.h>
#include <stdio.h>
#include<iomanip.h>
void jishu(int n) //任意奇数阶幻方制作的函数(阶梯法)
{
int p=n-1,q=0,s=1,i,j,t=n-1;
int b[50][50];
int a[100][100];
for(i=0;i<2*n-1;i++) //给数组a赋初值
for(j=0;j<2*n-1;j++)
a[i][j]=0;
while(p<2*n-1) //从a的中间起向下运动一直到最后
{
{
for(i=p;i>=p+1-n;i--) //根据行的变换,列数每次右移五格
for(j=q;j<q+n;j++)
if(i+j==t)
{
a[i][j]=s; //每次赋值都加1
s++;
}
}
t+=2;
q++;
p++;
}
for(i=0;i<2*n-1;i++) //把中间框以外的数字按规律填到中间的框内
for(j=0;j<2*n-1;j++)
{
if(i<(n-1)/2&&a[i][j]!=0) //格子上方的数填入数组中
{
a[i+n][j]=a[i][j];
}
else if(i>=(3*n-1)/2&&a[i][j]!=0) //格子下方的数填入数组中
{
a[i-n][j]=a[i][j];
}
else if(j<(n-1)/2&&a[i][j]!=0) //格子左方的数填入数组中
{
a[i][j+n]=a[i][j];
}
else if(j>=(3*n-1)/2&&a[i][j]!=0) //格子右方的数填入数组中
{
a[i][j-n]=a[i][j];
}
}
for(i=0;i<n;i++) //用一个新数组把a的中间提取出来
for(j=0;j<n;j++)
{
b[i][j]=a[i+(n-1)/2][j+(n-1)/2];
}
for(i=0;i<n;i++) //换行输出,每行5个
{
for(j=0;j<n;j++)
cout<<setw(3)<<b[i][j]<<" ";
cout<<endl;
}
}
void f1(int n) //设计的一个通用双偶函数
{
int a[100][100];
int i,j;
int x,k=1,m=3,t;
t=(n-1)/4;
if(t==0) //即n=4
{
for(i=0;i<=m;i++) //给数组依次赋初值1,2,3…
for(j=0;j<=m;j++)
{
a[i][j]=k;k++;
}
for(i=1;i<=2;i++) //用走日字的方法交换数组中的元素
{
x=a[0][i];a[0][i]=a[m][m-i];a[m][m-i]=x;
x=a[i][0];a[i][0]=a[m-i][m];a[m-i][m]=x;
}
for(i=0;i<=m;i++) //输出数组
{
for(j=0;j<=m;j++)
cout<<a[i][j]<<" ";
cout<<endl;
}goto loop; //跳到loop
}
for(i=0;i<8;i++) //给数组赋初值0
for(j=0;j<8;j++)
a[i][j]=0;
if(n%4==0&&n/4>1)
{
for(i=0;i<2;i++) //取左上角四个格子把主对角线上的元素赋值为1
for(j=0;j<2;j++)
{
if(i==j)
a[i][j]=1;
}
}
while(t>0)
{
for(i=0;i<2;i++) //水平复制刚才的四格
for(j=2;j<4;j++)
a[i][j]=a[i][j-2];
for(i=2;i<4;i++) //将上述八格水平翻转
for(j=0;j<4;j++)
a[i][j]=a[3-i][j];
for(i=0;i<n;i++) //水平对称翻转
for(j=n/2;j<n;j++)
a[i][j]=a[i][n-1-j];
for(i=n/2;i<n;i++) //垂直对称翻转 for(j=0;j<n;j++)
a[i][j]=a[n-1-i][j];
t--;
}
for(i=0;i<n;i++) //从左上角起,给值为0的元素重新赋值,值为n*i+j+1
for(j=0;j<n;j++)
if(a[i][j]==0)
a[i][j]=n*i+j+1;
for(i=n-1;i>=0;i--) //从右下角起,给值为1的元素重新赋值,值为n*n-n*i-j
for(j=n-1;j>=0;j--)
if(a[i][j]==1)
a[i][j]=n*n-n*i-j;
for(i=0;i<n;i++) //输出数组
{
for(j=0;j<n;j++)
cout<<setw(3)<<a[i][j]<<" ";
cout<<endl;
}
loop:;
}
void danou(int n) //设计的一个通用单偶函数
{
int p=n-1,q=0,s=1,i,j,t=n-1,v=n/2;
int a[50][50],b[50][50],c[50][50],d[50][50],e[100][100];
int m=(n-2)/4;
for(i=0;i<n/2;i++) //给数组赋初值
for(j=0;j<n/2;j++)
a[i][j]=0;
int x,y;
int max;
int mid;
max=v*v;
mid=v/2;
x=v-1;
y=mid+1;
for(i=0;i<n/2;i++) //将a做一次奇数阶幻方变换
for(j=0;j<n/2;j++)
a[i][j]=0; //设置初始值是0
a[0][mid]=1;
for(i=2;i<=max;i++)
{
if(x<0&&y>n/2-1)
{
x=0;y=n/2-1;x=x+1; //在最右上角超出
}
if(x<0)
{
x=n/2-1; //在上方超出
}
if(y>n/2-1) //在右方超出
{
y=0;
}
if(a[x][y]!=0)
{
x=x+2;y=y-1; //在右上角有数字
}
a[x][y]=i; //正常附值
x=x-1; //正常附值
y=y+1; //正常附值
}
for(i=0;i<n/2;i++) //给b数组赋值,在a的对应数上加2*v*v
for(j=0;j<n/2;j++)
b[i][j]=a[i][j]+2*v*v;
for(i=0;i<n/2;i++) //给c数组赋值,在a的对应数上加v*v
for(j=0;j<n/2;j++)
c[i][j]=a[i][j]+v*v;
for(i=0;i<n/2;i++) //给d数组赋值,在a的对应数上加3*v*v
for(j=0;j<n/2;j++)
d[i][j]=a[i][j]+3*v*v;
int temp; //定义交换变量
for(i=0;i<=n/2-1;i++) //将a和d的前面进行交换
for(j=0;j<m;j++)
{
temp=a[i][j];
a[i][j]=d[i][j] ;
d[i][j]=temp;
}
temp=a[(n-2)/4][0]; //a和d中间一行第一列的数再交换过来,即不交换
a[(n-2)/4][0]=d[(n-2)/4][0];
d[(n-2)/4][0]=temp;
temp=a[(n-2)/4][m]; //a和d中间一行第二列的数交换过来
a[(n-2)/4][m]=d[(n-2)/4][m];
d[(n-2)/4][m]=temp;
for(i=0;i<=n/2-1;i++) //将c和b的最后列进行交换
for(j=n/2-1;j>(n-2)/4+1;j--)
{
temp=b[i][j];
b[i][j]=c[i][j];
c[i][j]=temp;
}
for(i=0;i<n/2;i++) //用大数组e【100】【100】把四个小数组拼接起来
for(j=0;j<n/2;j++)
e[i][j]=a[i][j];
for(i=0;i<n;i++)
for(j=n/2;j<n;j++)
e[i][j]=b[i][j-n/2];
for(i=n/2;i<n;i++)
for(j=0;j<n/2;j++)
e[i][j]=d[i-n/2][j];
for(i=n/2;i<n;i++)
for(j=n/2;j<n;j++)
e[i][j]=c[i-n/2][j-n/2];
for(i=0;i<n;i++) //输出数组
{
for(j=0;j<n;j++)
cout<<setw(3)<<e[i][j]<<" ";
cout<<endl;
}
}
void main() //主函数
{ bool f=true;
while(f)
{
int n; //界面设计
cout<<endl;
cout<<setw(48)<<" 幻方制作"<<endl;
cout<<endl;
cout<<setw(50)<<"============="<<endl;
cout<<endl;
cout<<setw(50)<<" 1.奇数阶幻方"<<endl;
cout<<setw(50)<<" 2.偶数阶幻方"<<endl;
cout<<endl;
cout<<setw(56)<<"请选择(1或2,0:退出)"<<endl;
int k;
cin>>k;
//int k;
// cin>>k;
switch(k)
{
case 1:
cout<<"请输入奇数n(2<n<=10)"<<endl;
cin>>n;
if(n<3||n>=10||n%2==0)
{
do{
cout<<"对不起,您的输入有误,请重新来过!"<<endl;
cin>>n;
}while(n>=3&&n<10&&n%2!=0);
}
else
jishu(n);
break;
case 2:
cout<<"请输入需要的偶数n(2<n<=10)"<<endl;
cin>>n;
if(n<3||n>10||n%2!=0)
{
do{
cout<<"对不起,您的输入有误,请重新来过!"<<endl;
cin>>n;
}while(n>3&&n<=10&&n%2==0);
}
else{
if(n%4==0)
f1(n);
else if(n%2==0&&n%4!=0)
danou(n);
}
break;
case 0:f=false;break;
default:
cout<<"查无此号"<<endl;
}
}
} |
-
-
幻方制作.txt
6.04 KB, 下载次数: 2, 下载积分: 金币 -1 枚, 经验 1 点, 下载 1 次
|