Note: This article is available in Chinese only. 本文暂无英文版本。
View original
c语言上机。。。。
c写的幻方。
1/*************************************************************************
2> File Name: code/class/7.c
3> Author: 111qqz
4> Email: rkz2013@126.com
5> Created Time: 2015年11月11日 星期三 19时31分50秒
6************************************************************************/
7
8#include<stdio.h>
9#include <string.h>
10
11int n;
12int a[105][105];
13 13
14
15void swap(int *a,int *b)
16{
17int tmp;
18tmp = *a;
19*a = *b;
20*b = tmp;
21}
22int fix_x( int x,int k,int n)
23{
24if (k%2==1)
25{
26if (x==0)
27return n;
28else return x;
29}
30else
31{
32if (x==n)
33return n+n;
34else return x;
35}
36}
37int fix_y ( int y,int k,int n)
38{
39if (k<3)
40{
41if (y==n+1)
42return 1;
43else return y;
44}
45else
46{
47if (y==2*n+1)
48return n+1;
49else return y;
50}
51// if (y==n+1)
52// return 1;
53// else return y;
54}
55void print()
56{
57for ( int i = 1 ; i <= n ; i++)
58{
59for ( int j = 1 ; j <= n ; j++)
60printf("%d ",a[i][j]);
61 61
62printf("n");
63}
64 64
65}
66 66
67void OddMagic(int n,int x,int y,int k) //k表示4中状态。。。。
68{
69 69
70int cur ;
71if (k==1) cur = 1;
72if (k==4) cur = n*n+1;
73if (k==3) cur = n*n*2+1;
74if (k==2) cur = n*n*3+1;
75int cnt = 1;
76while (cnt<=n*n)
77{
78a[x][y]=cur;
79int prex = x;
80int prey = y;
81cur++;
82cnt++;
83x--;
84y++;
85x = fix_x(x,k,n);
86y = fix_y(y,k,n);
87if (a[x][y])
88{
89x = prex+1;
90y = prey;
91}
92 92
93}
94 94
95}
96int main()
97{
98memset(a,sizeof(a),0);
99scanf("%d",&n);
100if (n%2==1)
101{
102int x = 1;
103int y = n/2+1;
104OddMagic(n,x,y,1);
105}
106else
107{
108if (n%4==0)
109{
110for ( int i = 1,num=1 ; i <= n ; i++)
111for ( int j = 1 ; j <= n ; j++,num++)
112a[i][j]=num;
113
114
115for ( int i = 1 ; i <= n ; i++)
116{
117for ( int j = 1 ; j <= n ; j++)
118{
119if (i==j||i+j>=n+1) continue;
120int tmp;
121tmp = a[i][j];
122a[i][j] = a[n+1-i][n+1-j];
123a[n+1-i][n+1-j] = tmp;
124}
125}
126}
127else
128{
129int x = 1;
130int y = n/4+1;
131int hn = n/2;
132
133OddMagic(hn,x,y,1);
134OddMagic(hn,x+hn,y,2);
135OddMagic(hn,x,y+hn,3);
136OddMagic(hn,x+hn,y+hn,4);
137
138int m = n/4;
139for ( int i = 1 ; i <= hn ;i++)
140{
141for ( int j = 1 ; j <= m ; j++)
142{
143int tmp;
144if (i==m+1&&j;==m)
145{
146tmp = a[m+1][m+1];
147a[m+1][m+1] = a[m+1+hn][m+1];
148a[m+1+hn][m+1] = tmp;
149continue;
150
151}
152tmp = a[i][j];
153a[i][j] = a[i+hn][j];
154a[i+hn][j] = tmp;
155// swap(a[i][j],a[i+n][j]);
156}
157}
158
159for ( int i = 1 ; i <= hn ; i++)
160{
161for ( int j = n ; j>=n-m+2 ; j--)
162{
163int tmp;
164tmp = a[i][j];
165a[i][j] = a[i+hn][j];
166a[i+hn][j] = tmp;
167}
168}
169
170
171
172
173}
174}
175print();
176
177}