标签:
8-10 magic1.c
1 #include <stdio.h> 2 int Magic1(int **magic,int n) 3 { 4 if(n%2==0) //n为偶数,返回 5 return 0; 6 int i=0,k=1; //i为行号 7 int j=(n-1)/2; //计算列序号(位于行的中间) 8 magic[i][j]=k; //1行中位置添加1 9 while(k<n*n) 10 { 11 if(i-1<0 && j+1>=n) //超过上边区域,且列超过右边区域 12 { 13 i++; //向下移一行 14 magic[i][j]=++k; //填数 15 continue; 16 } 17 if(i-1<0) //行超过上边区域 18 i=n-1; //到最后一行 19 else 20 i--; //上移一行 21 if(j+1>=n) //列超过右边区域 22 j=0; //移到左边 23 else 24 j++; //右移一列 25 if(magic[i][j]==-1) //若为空 26 magic[i][j]=++k; //填入数 27 else//若不为空 28 { 29 i+=2; //下移两行 30 j--; //左移一列 31 magic[i][j]=++k; //填数 32 } 33 } 34 return 1; 35 } 36 int main() 37 { 38 int i,j,n,sum; 39 int **magic; 40 printf("方阵的阶数:"); 41 scanf("%d",&n); 42 if(!(magic=(int **)malloc(n*sizeof(int*)))) //分配保存二级指针的内存 43 { 44 printf("内存分配失败!\n"); 45 exit(1); 46 } 47 for(i=0;i<n;++i) //分配保存指针的数组内存 48 { 49 if(!(magic[i]=(int *)malloc(n*sizeof(int)))) 50 { 51 printf("内存分配失败!\n"); 52 exit(1); 53 } 54 } 55 for(i=0;i<n;i++) //初始化方阵 56 for(j=0;j<n;j++) 57 magic[i][j]=-1; 58 if(Magic1(magic,n)) //调用函数填充方阵 59 { 60 for(i=0;i<n;i++) //输出方阵 61 { 62 for(j=0;j<n;j++) 63 printf("%4d",magic[i][j]); 64 printf("\n"); 65 } 66 sum=0; 67 for(i=0;i<n;i++) //统计对角线的和 68 sum+=magic[i][i]; 69 printf("\n各行、列、对角线的和为:%d\n",sum); 70 } 71 else //生成方阵失败 72 printf("生成魔方阵失败,可能是输入的阶数不正确!\n"); 73 getch(); 74 return 0; 75 }
8-11 magic2.c
1 #include <stdio.h> 2 void swap(int *a,int *b) 3 { 4 int t; 5 t=*a; 6 *a=*b; 7 *b=t; 8 } 9 int Magic2(int **magic,int n) 10 { 11 int i,j,k=1; 12 if(n%4!=0) //阶数不是4个倍数 13 return 0; 14 for(i=0;i<n;i++)//初始填入数字 15 { 16 if(i<=n/4-1 || i>n/4-1+n/2) //上下部分按顺序填入数字 17 { 18 for(j=0;j<n;j++) 19 magic[i][j]=k++; 20 } 21 else//中间半数行按例序填入数字(水平翻转) 22 { 23 for(j=n-1;j>=0;j--) 24 magic[i][j]=k++; 25 } 26 } 27 for(j=n/4;j<(n/4+n/2);j++)//将中间半数的列进行上下翻转 28 for(i=0;i<n/2;i++) 29 swap(&magic[i][j],&magic[n-i-1][j]); //交换数据 30 return 1; 31 } 32 int main() 33 { 34 int i,j,n,sum; 35 int **magic; 36 printf("方阵的阶数:"); 37 scanf("%d",&n); 38 if(!(magic=(int **)malloc(n*sizeof(int*)))) //分配保存二级指针的内存 39 { 40 printf("内存分配失败!\n"); 41 exit(1); 42 } 43 for(i=0;i<n;++i) //分配保存指针的数组内存 44 { 45 if(!(magic[i]=(int *)malloc(n*sizeof(int)))) 46 { 47 printf("内存分配失败!\n"); 48 exit(1); 49 } 50 } 51 if(Magic2(magic,n)) //调用函数填充方阵 52 { 53 for(i=0;i<n;i++) //输出方阵 54 { 55 for(j=0;j<n;j++) 56 printf("%4d",magic[i][j]); 57 printf("\n"); 58 } 59 sum=0; 60 for(i=0;i<n;i++) //统计对角线的和 61 sum+=magic[i][i]; 62 printf("\n各行、列、对角线的和为:%d\n",sum); 63 } 64 else //生成方阵失败 65 printf("生成魔方阵失败,可能是输入的阶数不正确!\n"); 66 getch(); 67 return 0; 68 }
8-12 magic3.c
1 #include <stdio.h> 2 void swap(int *a,int *b) //交换数据 3 { 4 int t; 5 t=*a; 6 *a=*b; 7 *b=t; 8 } 9 int Magic3(int **magic,int n) 10 { 11 int i,j,sn; 12 if((n-2)%4!=0)//不是4K+2阶 13 return 0; 14 sn=(n-2)/4; 15 for(i=0;i<n;i++) //第1步,按顺序填入数据 16 for(j=0;j<n;j++) 17 magic[i][j]=i*n+j+1; 18 for(i=sn+1;i<=3*sn;i++) //第2步,将井字左右部分进行翻转 19 { 20 for(j=0;j<=n/2-1;j++) 21 { 22 if(j!=sn) 23 swap(&magic[i][j],&magic[i][n-1-j]); 24 } 25 } 26 for(i=sn+1;i<=3*sn;i++) //第2步,井字上下部分进行翻转 27 for(j=0;j<=n/2-1;j++) 28 if(j!=sn) 29 swap(&magic[j][i],&magic[n-1-j][i]); 30 for(i=0;i<=sn-1;i++) //第3步,将井字分隔线之横列及第k+2列两侧数字对调 31 { 32 swap(&magic[sn][i],&magic[sn][n-1-i]); 33 swap(&magic[n-1-sn][i],&magic[n-1-sn][n-1-i]); 34 swap(&magic[sn+1][i],&magic[sn+1][n-1-i]); 35 } 36 for(i=sn+1;i<=n-1-sn-1;i++) //两横列中央数字上下对调 37 swap(&magic[sn][i],&magic[n-1-sn][i]); 38 for(i=0;i<=n/2-1;i++) //左边列除交叉点外的数字垂直翻转 39 if(i!=sn) 40 swap(&magic[i][sn],&magic[n-1-i][sn]); 41 swap(&magic[sn][0],&magic[n-1-sn][0]); //第4步,将井字横线左侧数字上下对调 42 for(i=sn+1;i<=n/2-1;i++) //井字横线中央数字翻转 43 swap(&magic[sn][i],&magic[sn][n-1-i]); 44 for(i=sn+1;i<=n-1-sn-1;i++) //井字分隔线纵向中央数字除第2k+1列外左右对调 45 if(i!=n/2-1) 46 swap(&magic[i][sn],&magic[i][n-1-sn]); 47 return 1; 48 } 49 50 int main() 51 { 52 int i,j,n,sum; 53 int **magic; 54 printf("方阵的阶数:"); 55 scanf("%d",&n); 56 if(!(magic=(int **)malloc(n*sizeof(int*)))) //分配保存二级指针的内存 57 { 58 printf("内存分配失败!\n"); 59 exit(1); 60 } 61 for(i=0;i<n;++i) //分配保存指针的数组内存 62 { 63 if(!(magic[i]=(int *)malloc(n*sizeof(int)))) 64 { 65 printf("内存分配失败!\n"); 66 exit(1); 67 } 68 } 69 if(Magic3(magic,n)) //调用函数填充方阵 70 { 71 for(i=0;i<n;i++) //输出方阵 72 { 73 for(j=0;j<n;j++) 74 printf("%4d",magic[i][j]); 75 printf("\n"); 76 } 77 sum=0; 78 for(i=0;i<n;i++) //统计对角线的和 79 sum+=magic[i][i]; 80 printf("\n各行、列、对角线的和为:%d\n",sum); 81 } 82 else //生成方阵失败 83 printf("生成魔方阵失败,可能是输入的阶数不正确!\n"); 84 getch(); 85 return 0; 86 }
标签:
原文地址:http://www.cnblogs.com/wozixiaoyao/p/5686037.html