Chinaunix首页 | 论坛 | 博客
  • 博客访问: 294677
  • 博文数量: 69
  • 博客积分: 2946
  • 博客等级: 少校
  • 技术积分: 800
  • 用 户 组: 普通用户
  • 注册时间: 2010-04-09 04:15
文章分类

全部博文(69)

文章存档

2013年(6)

2012年(16)

2011年(18)

2010年(29)

分类: C/C++

2010-08-02 23:34:10

#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 ;
}


阅读(574) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~