一:奇魔方阵

算法:

1.第一个元素放在第一行中间一列
.下一个元素存放在当前元素的上一行、下一列。
.如果上一行、下一列已经有内容,则下一个元素的存放位置为当前列的下一行。
在找上一行、下一行或者下一列的时候,必须把这个矩阵看成是回绕的。

算法实现:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <math.h> #define MAXSIZE 100 int main()
{
//输出魔方阵
int n,i,j;
int row, col;
int lrow, lcol; //保存上一步数据,用于还原
int a[MAXSIZE][MAXSIZE] = { }; while ()
{
printf("print a odd number:(3-99)");
scanf("%d", &n);
if (n % )
break;
} row = ;
col
= (n - 1) / 2;
a[row][col] = ; for (i = ; i <= n*n; i++)
{
row--;
col++;
if (row < )
row = n - ;
if (col >= n)
col = ;
if (a[row][col]) //若是上一行下一列处有数据了,我们就要将下标还原,行数加一
{
row = lrow + ;
col = lcol;
if (row >= n)
row = ;
} lcol = col;
lrow = row;
a[row][col] = i;
} for (i = ; i < n; i++)
{
for (j = ; j < n; j++)
printf("%5d", a[i][j]);
printf("\n");
} system("pause");
return ;
}

二:阶数n = 4 * m(m =1,2,3……)的偶魔方的规律如下:

按数字从小到大,即1,,……n2顺序对魔方阵从左到右,从上到下进行填充;
将魔方阵分成若干个4×4子方阵,将子方阵对角线上的元素取出;
将取出的元素按从大到小的顺序依次填充到n×n方阵的空缺处。

算法实现:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <math.h> #define MAXSIZE 100 int main()
{
//输出魔方阵
int n,i,j;
int row, col;
int a[MAXSIZE][MAXSIZE] = { };
int tempArray[MAXSIZE*MAXSIZE / 2] = { }; //用于存放各个子方阵的主对角线 while ()
{
printf("print a even number:(4-100)");
scanf("%d", &n);
if (n % ==)
break;
} //步骤一:将数据按顺序填充
i = ;
for (row = ; row < n; row++)
for (col = ; col < n; col++)
a[row][col] = i++; //步骤二:将数据全部分为4X4子方阵,取出其中的主对角线,按照大小排序。注意:这里获取的数据已经是从小到大了
i = ;
for (row = ; row < n; row++)
{
for (col = ; col < n; col++)
{
if ((col % == row % ) || ((col % + row % ) == ))
{
tempArray[i] = a[row][col];
i++;
}
}
} //步骤三:将数据从大到小放入之前的子方阵对角线上
i--;
for (row = ; row < n; row++)
{
for (col = ; col < n; col++)
{
if ((col % == row % ) || ((col % + row % ) == ))
{
a[row][col] = tempArray[i];
i--;
}
}
} //步骤四:输出魔方阵
for (i = ; i < n; i++)
{
for (j = ; j < n; j++)
printf("%5d", a[i][j]);
printf("\n");
} system("pause");
return ;
}

三:阶数n = 4 * m + 2(m =1,2,3……)的魔方(单偶魔方)

将魔方分成A、B、C、D四个k阶方阵,这四个方阵都为奇方阵,利用上面讲到的方法依次将A、D、B、C填充为奇魔方。
交换A、C魔方元素,对魔方的中间行,交换从中间列向右的m列各对应元素;对其他行,交换从左向右m列各对应元素。
交换B、D魔方元素,交换从中间列向左m – 1列各对应元素。
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <math.h> #define MAXSIZE 6 int main()
{
//输出魔方阵
int n, i, j, k,temp;
int row, col;
int lrow, lcol;
int a[MAXSIZE][MAXSIZE] = { }; while ()
{
printf("print a even number:4*m+2<m=1,2,...>");
scanf("%d", &n);
if (n % == )
break;
} //步骤一:构建四个子方阵ADBC
//先构建A,然后对A进行每个元素加即可得到所有的子方阵
k = n / ;
row = ;
col = (k - ) / ;
a[row][col] = ;
for (i = ; i <= k*k;i++)
{
row--;
col++;
if (row < )
row = k - ;
if (col >= k)
col = ;
if (a[row][col])
{
row = lrow + ;
col = lcol;
if (row >= k)
row = ;
} lcol = col;
lrow = row;
a[row][col] = i;
} //按照顺序构建DBC方阵
for (row = ; row < k;row++)
{
for (col = ; col < k;col++)
{
a[row + k][col + k] = a[row][col] + k*k; //D子方阵
a[row][col + k] = a[row][col] + *k*k; //B子方阵
a[row + k][col] = a[row][col] + *k*k; //C子方阵
}
} //步骤二:交换AC子方阵的数据
//1.先交换中间行的右半部分的m列,N=2*(2*m+1),k=2*m+1,m=(k-1)/2,所以这里的m是不包含最后一列的,包含中间列
//2.对于其他行,将会每行的前半部分
for (row = ; row < k;row++)
{
if (row == k / ) //中间行
{
for (col = k / ; col < k - ; col++)
{
temp = a[row][col];
a[row][col] = a[row + k][col];
a[row + k][col] = temp;
}
}
else //其他行,交换前m列,不包含中间列
{
for (col = ; col < k / ;col++)
{
temp = a[row][col];
a[row][col] = a[row + k][col];
a[row + k][col] = temp;
}
}
} //步骤三:交换BD子方阵,交换中间列向左m-1列
for (row = ; row < k;row++)
{
for (i = ; i < (k - ) / - ; i++)
{
temp = a[row][k + k / - i];
a[row][k + k / - i] = a[row + k][k + k / - i];
a[row + k][k + k / - i] = temp;
}
} //步骤四:输出魔方阵
for (i = ; i < n; i++)
{
for (j = ; j < n; j++)
printf("%5d", a[i][j]);
printf("\n");
} system("pause");
return ;
}

C语言复习---输出魔方阵的更多相关文章

  1. C语言---魔方阵

    魔方阵的定义:在n*n的方阵中,每一行的和=每一列的和=对角线的和.(本文中涉及的n为大于3的奇数). 例如3*3的魔方阵为: 5*5的魔方阵为: 如何写魔方阵呢? 1.数字1位于第一行的正中间2.下 ...

  2. 基于visual Studio2013解决C语言竞赛题之0523魔方阵

     题目

  3. SDUST 作业10 Problem D 魔方阵

    Description 所谓N阶魔方阵,是一个N*N的方阵,其元素由1到N^2组成,且方阵每行每列以及对角线的元素和相等.如三阶魔方阵: 8 1 6 3 5 7 4 9 2     魔方阵的规律如下: ...

  4. Project 3:N级魔方阵

    魔方阵:由n*n个数字所组成的n阶方阵,具有各对角线,各横列与纵行的数字和都相等的性质,称为魔方阵.而这个相等的和称为魔术数字.若填入的数字是从1到n*n,称此种魔方阵为n阶正规魔方阵. 目标:输入一 ...

  5. C语言复习---零散补充

    一:double和float使用scanf获取数据 printf输出float和double都可以用%f,double还可以用%lf. 2 scanf输入float用%f,double输入用%lf,不 ...

  6. C语言复习20170728

    C语言复习20170728 键盘输入和屏幕输出 字符常量:把字符放在一对单引号内,适用于多数可打印字符. 转义字符: 以反斜线()开头,也是放在一对单引号内,适用于控制字符. .\t,是水平制表符,相 ...

  7. C语言复习-字符串与指针

    C语言复习-字符串与指针 例一: [字符串处理 去除C代码中的注释] C/C++代码中有两种注释,/* */和//.编译器编译预处理时会先移除注释.就是把/*和*/之间的部分去掉,把//以及之后的部分 ...

  8. C语言复习系列-转义字符

    C语言复习系列-转义字符 准备学习stm32单片机,感觉需要复习一下C语言,翻看了菜鸟教程,竟然有不少地方看不懂,真让人汗颜······ 转义字符大部分语言里面都有,至少我学过的里面都有,在这些语言中 ...

  9. Python旋转魔方阵

    [问题描述]输入一个自然数N(2≤N≤9),要求输出如下的魔方阵,即边长为N*N,元素取值为1至N*N,1在左上角,呈顺时针方向依次放置各元素. N=3时:    1    2    3    8   ...

随机推荐

  1. Codeforces1065G Fibonacci Suffix 【递推】【二分答案】

    题目分析: 首先为了简便起见我们把前$15$的答案找出来,免得我们还要特判$200$以内之类的麻烦事. 然后我们从$16$开始递推.考虑猜测第i位是$0$还是$1$(这本质上是个二分).一开始先猜是$ ...

  2. 安卓Android基础第三天——数据库,ListView

    数据库介绍sqlite问:什么情况下使用数据库?答:有大量相似结构的数据需要存储的时候 数据库的创建定义一个类继承SqliteOpenHelpercontext:上下文name:数据库名字,如&quo ...

  3. Java实现月份递减

    问题:从当前月份开始,往前3年的所有月份 返回map类型,key是String,value是Date,map倒序排列 public static Map<String, Date> get ...

  4. 百度APP爬虫

    1.抓包 访问一个频道,Charles抓包,找到真实连接,一般返回json数据和网页中数据对应为真实连接 请求方式为post,所以要添加请求头和表单数据,由于在charles环境下,所以要添加char ...

  5. Hdoj 2050.折线分割平面 题解

    Problem Description 我们看到过很多直线分割平面的题目,今天的这个题目稍微有些变化,我们要求的是n条折线分割平面的最大数目.比如,一条折线可以将平面分成两部分,两条折线最多可以将平面 ...

  6. 洛谷P3740 【[HAOI2014]贴海报】

    (呃...本蒟蒻的第一篇题解qwq)..不废话了讲正题..思路来源于铺地毯(-->传送门)..先算出每一个格子上覆盖的海报并把可见的海报做标记然后算出有多少海报是可见的..但是作为省选题怎么可能 ...

  7. SElinux解决web网站无法访问

    SElinux解决web网站无法访问工具/原料centos 6.5系统httpd web服务器 SELinux 设置为enforcing:强制模式,代表 SELinux 运作中 方法/步骤1. 1se ...

  8. HDU6341 Let Sudoku Rotate (杭电多校4J)

    给一个由4*4个4*4的小格组成数独,这些数独是由一个块逆时针旋转得来的,所以要还原的话就模拟出顺时针的过程,先把里面的字母转化成数字,然后从第一个块开始枚举,每个dfs和之前枚举的已经满足条件的块, ...

  9. PWM实现ADC和DAC

    一.PWM实现AD 利用普通单片机的2个IO及一个运算放大器即可实现AD转换电路,而且很容易扩展成多通道.其占用资源少,成本低,AD 转换精度可以达到8位甚至更高,因此具有一定的实用价值. 1.1 硬 ...

  10. Linux下使用pv监控进度

    使用pv移动文件 pv example.mkv > /tmp/example.mkv 使用pv监控dd pv -cN source < example.iso | dd of=/dev/s ...