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

    xiaoxiao2021-03-25  208

    基数魔方阵

    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"); } }
    转载请注明原文地址: https://ju.6miu.com/read-894.html

    最新回复(0)