文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>n维幻方

n维幻方

时间:2010-08-02  来源:hbj_2008

#include<iostream>
#include<cstdlib>
#define max 502
int array[max][max]={0};
int a[max][max] = {0} ;
using namespace std ;

void lun(int i , int n )
{
for(int j=1;j<n;j++)
array[i][j]=array[i-1][j-1];
array[i][0]=array[i-1][n-1];
}

void swap(int i , int k,int t)
{
int temp ;
temp = a[i][k];
a[i][k]=a[i+t][k];
a[i+t][k]=temp ;
}
void setshun(int p , int q , int n)
{
int temp = n*n + 1 ;
for(int i=0;i<4;i++)
{
a[p-i][q+i]=temp - a[p-i][q+i];
a[p-3+i][q+i]=temp - a[p-3+i][q+i];
}
}

void quen(int n) //奇幻方
{
for(int i=0;i<=(n-1)/2;i++)
array[0][i]=(n+1)/2+i ;
for(int i=(n+1)/2;i<n;i++)
array[0][i]=i-(n-1)/2;
for(int i=1;i<n;i++)
lun(i,n);
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
a[i][j]=(array[i][j]-1)*n+array[i][n-1-j];
}

void dduen(int n) //双偶幻方
{
int k =1 ;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
a[i][j]= k ++ ;
int flag = n/4 ;
for(int i= 1 ; i<=flag ;i++)
for(int j=0;j<flag;j++)
setshun(4*i-1,4*j,n) ;
}

void duen(int n) //单偶幻方
{
int t = n/2 ;
quen(t); //求A部分
int s = t*t ;
int * p = new int[t] ;

for(int i=0;i<t;i++) //*p的初始化
p[i]=0;
p[(t-1)/2]= (t-1)/2 ;

int flag = (n-2)/4 ;
for(int i=0;i<t;i++)
for(int j=0;j<t;j++)
{ //A
a[i][j+t]=a[i][j]+s*2 ; //B
a[i+t][j]=a[i][j]+s*3 ; //C
a[i+t][j+t]=a[i][j]+ s ; //D
}
for(int i=0;i<t;i++) //A,C象限交换
for(int u=0;u<flag;u++)
swap(i,p[i]+u,t);
for(int i=t+(t-1)/2 ; i<t+(t-1)/2+flag-1;i++) //B,D象限交换列
for(int j=0;j<t;j++)
swap(j,i,t);
}
int main()
{
int number ;
cin>>number ;
int * p = new int[2*number+2];

if(number%2!=0&&number>2)
quen(number);
else if(number%4==0&&number>2)
dduen(number);
else if((number%4!=0&&number%2==0)&&number>2)
duen(number);
for(int i=0;i<number;i++)
for(int j=0;j<number;j++)
{
cout<<a[i][j]<<" ";
if(j==number-1)cout<<endl;
}

system("pause");
return 0 ;
}


相关阅读 更多 +
排行榜 更多 +
辰域智控app

辰域智控app

系统工具 下载
网医联盟app

网医联盟app

运动健身 下载
汇丰汇选App

汇丰汇选App

金融理财 下载