幻方....

c语言上机。。。。

c写的幻方。

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

时间: 2024-10-09 12:13:48

幻方....的相关文章

各种幻方一览

在一个由若干个排列整齐的数组成的正方形中,图中任意一横行.一纵行及对角线的几个数之和都相等,具有这种性质的图表,称为"幻方".我国古代称为"河图"."洛书",或者"纵横图". 一.三阶幻方(三三图,九宫格) 即:纵横斜各条线上之和都等于15. 口诀:戴九履一,左三右七,二四有肩,六八为足,五居中央. 2 9 4 7 5 3 6 1 8 注:其他一次变幻即可(如整体左旋.右旋等). 二.四阶幻方(四四图) 即:用16以内的数补全

东方14模拟赛之noip2015/day1/3/神奇的幻方

总时间限制:  10000ms 单个测试点时间限制:  1000ms 内存限制:  128000kB 描述 幻方是一种很神奇的N*N 矩阵:它由数字 1,2,3, … …,N*N 构成,且每行.每列及两条对角线上的数字之和都相同. 当N为奇数时,我们可以通过以下方法构建一个幻方: 首先将 1 写在第一行的中间. 之后,按如下方式从小到大依次填写每个数K(K= 2,3, …,N*N ): 若 (K−1) 在第一行但不在最后一列,则将K填在最后一行,(K−1) 所在列的右一列: 若 (K−1) 在最

AC日记——神奇的幻方 洛谷 P2615(大模拟)

题目描述 幻方是一种很神奇的N*N矩阵:它由数字1,2,3,……,N*N构成,且每行.每列及两条对角线上的数字之和都相同. 当N为奇数时,我们可以通过以下方法构建一个幻方: 首先将1写在第一行的中间. 之后,按如下方式从小到大依次填写每个数K(K=2,3,…,N*N): 1.若(K−1)在第一行但不在最后一列,则将K填在最后一行,(K−1)所在列的右一列: 2.若(K−1)在最后一列但不在第一行,则将K填在第一列,(K−1)所在行的上一行: 3.若(K−1)在第一行最后一列,则将K填在(K−1)

NOIP 2015普及组复赛Day1 T1 == Codevs4510 神奇的幻方

时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题目描述 Description: 幻方是一种很神奇的N∗N矩阵:它由数字 1,2,3, … … ,N∗N构成,且每行.每列及两条对角线上的数字之和都相同. 当N为奇数时,我们可以通过以下方法构建一个幻方: 首先将 1写在第一行的中间.之后,按如下方式从小到大依次填写每个数(K= 2,3, … ,N∗N ): 1.若 (K−1)在第一行但不在最后一列,则将 填在最后一行,(K−1)所在列的右一列: 2.若 (K

神奇的幻方【够造奇数阶的魔方阵】

http://noi.openjudge.cn/ch0108/22/ 总时间限制:  1000ms 内存限制:  65535kB 描述 幻方是一个很神奇的N*N矩阵,它的每行.每列与对角线,加起来的数字和都是相同的.我们可以通过以下方法构建一个幻方.(阶数为奇数)1.第一个数字写在第一行的中间2.下一个数字,都写在上一个数字的右上方:    a.如果该数字在第一行,则下一个数字写在最后一行,列数为该数字的右一列    b.如果该数字在最后一列,则下一个数字写在第一列,行数为该数字的上一行    

2015年 day1.1 神奇的幻方

神奇的幻方 题目描述 幻方是一种很神奇的N*N矩阵:它由数字1,2,3,……,N*N构成,且每行.每列及两条对角线上的数字之和都相同. 当N为奇数时,我们可以通过以下方法构建一个幻方: 首先将1写在第一行的中间. 之后,按如下方式从小到大依次填写每个数K(K=2,3,…,N*N): 1.若(K−1)在第一行但不在最后一列,则将K填在最后一行,(K−1)所在列的右一列: 2.若(K−1)在最后一列但不在第一行,则将K填在第一列,(K−1)所在行的上一行: 3.若(K−1)在第一行最后一列,则将K填

听说noip2015有幻方

终于可以说一句:pascal大法好了 magic.pp是写好的算幻方哦…… 虽然这种水题大家都会,也没什么卵用……

Java 实现任意N阶幻方的构造

一.关于单偶数阶幻方和双偶数阶幻方 (一)单偶数阶幻方(即当n=4k+2时) 任何4k+2 阶幻方都可由2k+1阶幻方与2×2方块复合而成,6是此类型的最小阶. 以6阶为例,可由3阶幻方与由0,1,2,3组成的2×2的小方块拼成一个6×6的大方块复合而成. 其中,3阶幻方(洛书)如下图1所示, (图1) 800x600 Normal 0 7.8 磅 0 2 false false false EN-US ZH-CN X-NONE MicrosoftInternetExplorer4 /* Sty

Java 实现奇数阶幻方的构造

一.设计的流程图如下所示 二.Java 语言的代码实现 package MagicSquare; //奇数幻方的实现 public class Magic_Odd { //n 为幻方的阶数 public static int[][] magicOdd(int n) { //构造一个(n+2)*(n+2)阶的方阵 int[][] square = new int[n + 1][n + 1]; int i = 0; int j = (n + 1) / 2; //从第一行的中间那个数字(是1)开始填幻