基数魔方阵
1》第一行中间位取值1
2》然后 后面的n*n -1 个数按以下规则
下一个数是前一个数的 行-1 列 +1 若是行是0 则为n-1;若列是n-1,则为0;若定位后的pos有了数字,那么pos重定向为row-1 col
偶数幻方阵
单偶:
单偶先把方阵,划分为ABCD四个方阵,1>先按照基数魔方阵对其依次填值;2>然后对每两个(AC...BD)个基数魔方阵进行变幻,AC是一个规则,BD是一个规则
规则就不细说了
双偶:
先把方阵安照1-n*n从左到右,然后是将方阵划分为ABCD四个子方阵,然后对每一个方阵做一种处理,就是每一个方阵的对角线上的值换成 n*n-i值
#include <stdlib.h>
#include <stdio.h>#include <ctype.h>
void transSuang(int **app,int i,int iend,int j,int jend,int sum);
void printapp(int **app,int a);
int printmofang();
int mofang(int a);
int huanfang(int a);
int dan(int a);
int suang(int a);
typedef struct Posvalue{int col;int row;int value;}posValue;
void main(char argc,char* argv[]){
printmofang();
}
int printmofang(){
int num ;
printf("%s\n","please input a number..");
int tag = scanf("%d",&num);
while(!tag){
printf("%s","please input again..");
fflush(stdin);
tag = scanf("%d",&num); //用scanf获取输入值的时候 值还没有立即赋给变量 而是在缓冲区,需要手动fflush刷新一下
fflush(stdin);
}
return num%2!=0?mofang(num):huanfang(num);
}
int huanfang(int a){
if(a == 2){
printf("%s\n","can not construct this model");
return -1;
}
return a%4!=0?dan(a):suang(a);
}
//单阶幻方 4*k+2
int dan(int a){
return 1;
}
//双阶幻方 4*k
int suang(int a){
int **app = (int **)calloc(a,sizeof(int *));
int tag = 1;
for(int i=0;i<a;i++){
app[i] = (int *)calloc(a,sizeof(int));
for(int j=0;j<a;j++){
*(app[i]+j) = tag;
tag+=1;
}
}
int pos = (a-1)/2;
int temp = a/2;
for(int j=0;j<a;j+=temp){
for(int k=0;k<a;k+=temp){
transSuang(app,j,j+pos,k,k+pos,1+a*a);
}
}
printapp(app,a);
return 1;
}
// i是行起始位置 iend行结束位置 j是列的起始位置 jend是列的结束位置
void transSuang(int **app,int i,int iend,int j,int jend,int sum){
for(int x=i,y=j;x<=iend,y<=jend;x++,y++){
app[x][y] = sum - app[x][y];
}
for(int q=iend,w=j;q>=0,w<=jend;q--,w++){
app[q][w] = sum - app[q][w];
}
}
int mofang(int a){
//开辟空间 然后置为零
int **app = (int**)malloc(a*sizeof(int *));
for(int i=0;i<a;i++){
*(app+i) = (int *)calloc(a,sizeof(int));
for(int j=0;j<a;j++){
app[i][j] = 0;
}
}
//位置判定
int pos = a/2;
int row = 0;
app[row][a/2] = 1;
for(int k=2;k<=a*a;k++){
if(row == 0 && pos == a-1){
row = a-1;
pos = 0;
}else if(pos == a-1 && row != 0){
pos = 0;
row = row-1;
}else if(row != 0 && pos != a-1){
row = row -1;
pos = pos+1;
}else if(pos != a-1 && row == 0){
pos = pos + 1;
row = a-1;
}
while(app[row][pos] != 0){
if(row == a-1){
row=0;
}else{
row= row + 1;
}
}
app[row][pos] = k;
}
printapp(app,a);
free(app);
return 1;
}
void printapp(int **app,int a){
for(int x=0;x<a;x++){
for(int y=0;y<a;y++){
printf("%d ",app[x][y]);
}
printf("\n");
}
}