重温c语言 谭浩强 输出魔方阵 目前只做了基数魔方 以及 双偶幻方,单偶同理


基数魔方阵

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");
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值