用递归的方式解决n阶幻方

include <stdio.h>

include <stdlib.h>

void f(int num,int n,int a[][n],int hang1,int lie1){
a[hang1][lie1]=num;

if(num==n*n){return;}
int nexthang,nextlie;

if(hang1==0&&lie1!=n-1){
    //a[n-1][lie1+1]=++num;
    nexthang=n-1;
    nextlie=lie1+1;
    //return f(num,n,a,n-1,lie1+1);
}
else if(lie1==n-1&&hang1!=0){
    //a[hang1-1][0]=++num;
    nexthang=hang1-1;
    nextlie=0;
    //return f(num,n,a,hang1-1,0);
}
else if(hang1==0&&lie1==n-1){
    //a[hang1+1][lie1]=++num;
    nexthang=hang1+1;
    nextlie=lie1;
    //return f(num,n,a,hang1+1,lie1);
}
else if(hang1!=0&&lie1!=n-1){
    if(a[hang1-1][lie1+1]==0){
        //a[hang1-1][lie1+1]=++num;
        nexthang=hang1-1;
        nextlie=lie1+1;
        //return f(num,n,a,hang1-1,lie1+1);
    }
    else{
        //a[hang1+1][lie1]=++num;
        nexthang=hang1+1;
        nextlie=lie1;
        //return f(num,n,a,hang1+1,lie1);
    }
}
else{return;}
return f(num+1,n,a,nexthang,nextlie);

}
int main(){
int n;
scanf("%d",&n);
int a[n][n];
int hang,lie;int num=1;
for(hang=0;hang<n;hang++){
for(lie=0;lie<n;lie++){
a[hang][lie]=0;
}
}
f(1,n,a,0,(n-1)/2);

for(hang=0;hang<n;hang++){
    for(lie=0;lie<n;lie++){
        if(lie==n-1){
            printf("%d",a[hang][lie]);
        }
        else{
            printf("%d ",a[hang][lie]);
        } 
    }
    if(hang!=n-1){
        printf("\n");
    }
}

return 0;

}

posted @ 2025-11-16 00:21  Wang040404  阅读(5)  评论(0)    收藏  举报