主题 : c++语言实现幻方
千山同一月 万户尽皆春 千江有水千江月 万里无云万里天
级别: 总版主

UID: 998
精华: 0
发帖: 605198
威望: 536292 点
无痕币: 2 WHB
贡献值: 0 点
在线时间: 67368(时)
注册时间: 2008-12-25
最后登录: 2025-04-19

0 c++语言实现幻方

c++语言实现
(1)求奇数幻方
#include"stdio.h"
#include"math.h"
int a[256][256];
int sum;
int check();
void ins(int n);
void main(){  
    int i,j,n,k,t,p,x;  
    scanf("%d",&n);  
    sum=(n*n+1)*n/2;  
    if(n%2==1) //奇数幻方    
        ins(n);  
    if(n%4==2) { //单偶数幻方    
        k=n/2;    
        ins(k);    
        for(i=0; i<k; i++)      
            for(j=0; j<k; j++){      
                a[j+k]=a[j]+2*k*k;        
                a[i+k][j]=a[j]+3*k*k;        
                a[i+k][j+k]=a[j]+k*k;      
            }    
            t=(n-2)/4;    
            for(i=0; i<k; i++)      
                for(j=0; j<k; j++){        
                    if((j<t)&&(i<t)){          
                    p=a[j];          
                    a[j]=a[i+k][j];        
                    a[i+k][j]=p;        
                }
                if((j<t)&&(i>k-t-1)){          
                    p=a[j];          
                    a[j]=a[i+k][j];          
                    a[i+k][j]=p;        
                }
                if((i>=t&&i<=k-t-1)&&(j>=t&&j<t*2)){          
                    p=a[j];          
                    a[j]=a[i+k][j];          
                    a[i+k][j]=p;        
                }
                if(j>1&&j<=t){      
                    p=a[j+k];      
                    a[j+k]=a[i+k][j+k];          
                    a[i+k][j+k]=p;        
                }      
            }  
        }  
        if(n%4==0) { //双偶数幻方    
            x=1;    
            for(i=0; i<n; i++)      
                for(j=0; j<n; j++)        
                    a[j]=x++;    
                for(i=0; i<n; i++)      
                    for(j=0; j<n; j++){        
                        if(i%4==0&&abs(i-j)%4==0)          
                            for(k=0; k<4; k++)            
                                a[i+k][j+k]=n*n-a[i+k][j+k]+1;        
                        else if(i%4==3&&(i+j)%4==3)          
                            for(k=0; k<4; k++)            
                                a[i-k][j+k]=n*n-a[i-k][j+k]+1;      
                    
                }  
        }  
        if(check(n)==1){    
            for(i=0; i<n; i++){      
                for(j=0; j<n; j++)        
                    printf("%5d",a[j]);      
                printf("\n");    
            }  
        }
    }
    int check(int n) { //检验是否是幻方  
    int i,j,sum1=0,sum2;  
    for(i=0; i<n; i++){    
        for(j=0; j<n; j++)      
            sum1+=a[j];    
        if(sum1!=sum)      
            return 0;    
        sum1=0;  
    }  
    for(i=0; i<n; i++){    
        for(j=0; j<n; j++)      
            sum1+=a[j];    
        if(sum1!=sum)      
            return 0;    
        sum1=0;  
    }  
    for(sum1=0,sum2=0,i=0,j=0; i<n; i++,j++){    
        sum1+=a[j];    
        sum2+=a[n-j-1];  
    }  
    if(sum1!=sum)    
        return 0;  
    if(sum2!=sum)    
        return 0;  
    else    
        return 1;
}
void ins(int n) { //单偶数幻方的输入  
    int x,y,m;  
    x=0;  
    y=n/2;  
    for(m=1; m<=n*n; m++){  
        a[x][y]=m;  
        if(m%n!=0){    
            x--;    
            y++;    
            if(x<0)
                x=x+n;    
            if(y==n)
                y=n-y;    
        }
        else{      
            x++;      
            if(x==n)
                x=x-n;  
        }  
    }
}
(2)求单偶幻方
#include<iostream.h>
#include<iomanip.h>
int main(){  
    int n,i=0,j=0,a[100][100],tot=0;
    cout<<"请输入4的倍数"<<endl;
    cin>>n;
    for(i=0;i<n;i++)    
        for(j=0; j<n; j++){      
            a[j]=++tot;
        }  
        for(i=0; i<n; i++){    
            for(j=0; j<n; j++){    
                if(i%4==j%4||i%4+j%4==3)      
                    a[j]=n*n+1-a[j];
                }  
            }  
            for(i=0; i<n; i++){    
                for(j=0; j<n; j++){      
                    cout<<setw(4)<<a[j];
                }        cout<<endl;
        }  
        return 0;
}
级别: 七朵秋菊

UID: 219073
精华: 0
发帖: 24869
威望: 25970 点
无痕币: 90 WHB
贡献值: 0 点
在线时间: 1740(时)
注册时间: 2013-09-06
最后登录: 2025-04-18

谢楼主辛苦分享!
级别: 六行秋雁
UID: 253420
精华: 0
发帖: 1583
威望: 11777 点
无痕币: 18626 WHB
贡献值: 0 点
在线时间: 334(时)
注册时间: 2015-05-16
最后登录: 2025-04-19

谢楼主辛苦分享
Total 0.051105(s) query 5, Time now is:04-19 19:21, Gzip enabled 粤ICP备07514325号-1
Powered by PHPWind v7.3.2 Certificate Code © 2003-13 秋无痕论坛