8.3 魔术方阵

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 }

 

转载于:https://www.cnblogs.com/wozixiaoyao/p/5686037.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值