任意阶幻方(魔方矩阵)C语言实现
------------------来自百度
先标出引用地址:
http://blog.ddedu.com.cn/user1/88/archives/2007/2007420143329.shtml //任意阶幻方构造方法
http://blog.csdn.net/cmutoo/article/details/5487157 //任意阶幻方C语言代码实现(有些许错误)
基础知识这里看:http://blog.csdn.net/oowgsoo/article/details/1567910
任意阶幻方的构造方法有很多种,所以要选定一种易于代码实现的一种
在上篇博客中说道:
/************************************************************************************
幻方的数量:
与我们大多数人的常识不同,幻方的数量不是唯一的,而且也不是一个简单的问题
3阶幻方只有1种
4阶幻方有880种,通过旋转和反射,总共可以有7040个幻方
5阶幻方有275 305 224个,这是用计算机算的
6阶幻方,大概是1.7743*10**19~1.7766*10**19之间,这是用统计学方法计算的,居然计算机也算不出来,更不要说6阶以上的幻方数量了
************************************************************************************/
所以代码实现的就有很大的局限性,只能实现某一种构造方法的幻方
幻方构造分为
1、奇数阶
2、双偶阶
3、单偶阶
三种。
对于奇数阶的幻方:
/*******************************************************************
把1(或最小的数)放在第一行正中; 按以下规律排列剩下的n×n-1个数:
(1)每一个数放在前一个数的右上一格;
(2)如果这个数所要放的格已经超出了顶行那么就把它放在底行,仍然要放在右一列;
(3)如果这个数所要放的格已经超出了最右列那么就把它放在最左列,仍然要放在上一行;
(4)如果这个数所要放的格已经超出了顶行且超出了最右列,那么就把它放在前一个数的下一行同一列的格内;
(5)如果这个数所要放的格已经有数填入,处理方法同(4)。
这种写法总是先向“右上”的方向,象是在爬楼梯。
void Odd(int n,int index)
{
while(st != index)
{
cube[ox+stx][oy+sty] = st++; if((st-) % n != )
{
stx--;
sty++;
}
else
{
stx++;
} stx = ((stx-)%n+n)%n+;
sty = (sty%n == ? n : sty%n); }
}
对于双偶数阶的
就是一个中心对称
void DouEven(int n)
{
int i,j;
int st = ;
for(i=; i<=n; i++)
{
for(j=; j<=n; j++)
{
cube[i][j] = st++;
}
} int zx,zy,fx,fy;
for(i=; i<=n*n; i+=)
{ for(j=; j<=n*n; j+=)
{
zx=i-,zy=j-,fx=i,fy=j-;
cube[zx][zy]=n*n-cube[zx][zy]+;
cube[zx+][zy+]=n*n-cube[zx+][zy+]+;
cube[zx+][zy+]=n*n-cube[zx+][zy+]+;
cube[zx+][zy+]=n*n-cube[zx+][zy+]+; cube[fx][fy]=n*n-cube[fx][fy]+;
cube[fx-][fy+]=n*n-cube[fx-][fy+]+;
cube[fx-][fy+]=n*n-cube[fx-][fy+]+;
cube[fx-][fy+]=n*n-cube[fx-][fy+]+;
}
}
}
对于单偶数阶的,麻烦许多
因为要用到奇数阶的构造方法
void SingleEven(int n)
{
int i,j; ox=oy=;st=;
stx=,sty=(n/+)/;
Odd(n/,n*n*/+); //A ox=oy=n/;
stx=,sty=(n/+)/;
Odd(n/,n*n*/+); //D ox=,oy=n/;
stx=,sty=(n/+)/;
Odd(n/,n*n*/+); //B ox=n/,oy=;
stx=,sty=(n/+)/;
Odd(n/,n*n*/+); //C int k=(n-)/,tmp;
for(j=; j<=n/; j++)
{
for(i=; i<=k; i++)
{
if(j != (n/+)/)
{
tmp = cube[j][i];
cube[j][i] = cube[j+n/][i];
cube[j+n/][i] = tmp;
}
else
{
tmp = cube[j][i+(n/+)/-];
cube[j][i+(n/+)/-] = cube[j+n/][i+(n/+)/-];
cube[j+n/][i+(n/+)/-] = tmp;
}
}
}
if(k-)
{
for(i=; i<=n/; i++)
{
int tmpp = (*n+)/-;
for(j=; j<=k-; j++)
{
tmp = cube[i][j+tmpp];
cube[i][j+tmpp] = cube[i+n/][j+tmpp];
cube[i+n/][j+tmpp] = tmp; }
}
}
}
最后贴一个完整的代码:
#include <stdio.h>
#include <string.h> int cube[][];
int stx,sty;
int st;
int num;
int ox,oy; void Odd(int n,int index)
{
while(st != index)
{
cube[ox+stx][oy+sty] = st++; if((st-) % n != )
{
stx--;
sty++;
}
else
{
stx++;
} stx = ((stx-)%n+n)%n+;
sty = (sty%n == ? n : sty%n); }
} void DouEven(int n)
{
int i,j;
int st = ;
for(i=; i<=n; i++)
{
for(j=; j<=n; j++)
{
cube[i][j] = st++;
}
} int zx,zy,fx,fy;
for(i=; i<=n*n; i+=)
{ for(j=; j<=n*n; j+=)
{
zx=i-,zy=j-,fx=i,fy=j-;
cube[zx][zy]=n*n-cube[zx][zy]+;
cube[zx+][zy+]=n*n-cube[zx+][zy+]+;
cube[zx+][zy+]=n*n-cube[zx+][zy+]+;
cube[zx+][zy+]=n*n-cube[zx+][zy+]+; cube[fx][fy]=n*n-cube[fx][fy]+;
cube[fx-][fy+]=n*n-cube[fx-][fy+]+;
cube[fx-][fy+]=n*n-cube[fx-][fy+]+;
cube[fx-][fy+]=n*n-cube[fx-][fy+]+;
}
}
} void SingleEven(int n)
{
int i,j; ox=oy=;st=;
stx=,sty=(n/+)/;
Odd(n/,n*n*/+); //A ox=oy=n/;
stx=,sty=(n/+)/;
Odd(n/,n*n*/+); //D ox=,oy=n/;
stx=,sty=(n/+)/;
Odd(n/,n*n*/+); //B ox=n/,oy=;
stx=,sty=(n/+)/;
Odd(n/,n*n*/+); //C int k=(n-)/,tmp;
for(j=; j<=n/; j++)
{
for(i=; i<=k; i++)
{
if(j != (n/+)/)
{
tmp = cube[j][i];
cube[j][i] = cube[j+n/][i];
cube[j+n/][i] = tmp;
}
else
{
tmp = cube[j][i+(n/+)/-];
cube[j][i+(n/+)/-] = cube[j+n/][i+(n/+)/-];
cube[j+n/][i+(n/+)/-] = tmp;
}
}
}
if(k-)
{
for(i=; i<=n/; i++)
{
int tmpp = (*n+)/-;
for(j=; j<=k-; j++)
{
tmp = cube[i][j+tmpp];
cube[i][j+tmpp] = cube[i+n/][j+tmpp];
cube[i+n/][j+tmpp] = tmp; }
}
}
} void print(int n)
{
int i,j; for(i=; i<=n; i++)
{
int sum = ;
for(j=; j<=n ; j++)
{
sum += cube[i][j];
printf("%4d",cube[i][j]);
}
printf(" sum = %d",sum);
printf("\n");
}
} int main()
{ int i,j,k,t,n,m;
do
{
printf("Please Input n(3-17): ");
scanf("%d",&n);
if(n<)continue; memset(cube,,sizeof(cube));
if(n % == )
{
stx=,sty=(n+)/;
ox=oy=;
st=;
Odd(n,n*n+);
print(n);
}
else if(n % == )
{
DouEven(n);
print(n);
}
else if(n % == && n % != )
{ SingleEven(n);
print(n);
}
}while(); return ;
}
再上一个专门关于介绍幻方的博客:http://blog.sina.com.cn/u/1225071715
任意阶幻方(魔方矩阵)C语言实现的更多相关文章
- 任意阶魔方阵(幻方)的算法及C语言实现
写于2012.10: 本来这是谭浩强那本<C程序设计(第四版)>的一道课后习题,刚开始做得时候去网上找最优的算法,结果发现奇数和双偶数(4的倍数)的情况下算法都比较简单,但是单偶数(2的倍 ...
- Java 实现任意N阶幻方的构造
一.关于单偶数阶幻方和双偶数阶幻方 (一)单偶数阶幻方(即当n=4k+2时) 任何4k+2 阶幻方都可由2k+1阶幻方与2×2方块复合而成,6是此类型的最小阶. 以6阶为例,可由3阶幻方与由0,1,2 ...
- 【C++小白成长撸】--(续)单偶数N阶魔方矩阵
1 /*程序的版权和版本声明部分: **Copyright(c) 2016,电子科技大学本科生 **All rights reserved. **文件名:单偶数N阶魔方矩阵 **程序作用:单偶数N阶魔 ...
- 【C++小白成长撸】--N阶幻方(魔阵)矩阵
解决方法:1.第一个元素放在第一行中间一列 2.下一个元素存放在当前元素的上一行.下一列. 3.如果上一行.下一列已经有内容,则下一个元素的存放位置为当前列的下一行. 在找上一行.下一行或者下一列的时 ...
- Java 实现奇数阶幻方的构造
一.设计的流程图如下所示 二.Java 语言的代码实现 package MagicSquare; //奇数幻方的实现 public class Magic_Odd { //n 为幻方的阶数 publi ...
- Codeforces 710C. Magic Odd Square n阶幻方
C. Magic Odd Square time limit per test:1 second memory limit per test:256 megabytes input:standard ...
- n阶幻方
前序 最近在学习一些经典的算法,搞得头昏脑涨,就想换换脑子.在家里的旧书堆里面乱翻,无意中将一本具有十多年历史的小学数学奥林匹克竞赛的书发掘了出来,能放到现在挺不容易的,就拿起来随便翻翻.看了看目录, ...
- codeforces 710C Magic Odd Square(构造或者n阶幻方)
Find an n × n matrix with different numbers from 1 to n2, so the sum in each row, column and both ma ...
- n阶幻方问题
转载自:http://blog.csdn.net/fengchaokobe/article/details/7437767 目录 第一节 n阶幻方问题 第二节 由n阶幻方引发 ...
随机推荐
- Color Space: Ycc
在进行图像扫描时,有一种重要的扫描输入设备PhotoCd,由于PhotoCd在存储图像的时候要经过一种模式压缩,所以PhotoCd采用了Ycc颜色空间,此空间将亮度作由它的主要组件,具有两个单独的颜色 ...
- 一次与iptables有关的Openstack排错
先说下环境: 宿主机A(192.168.1.242)上运行着实例a(192.168.1.176), 宿主机B(192.168.1.56)上运行着实例b(192.168.1.50). 用户说从实例b上t ...
- python 安装mysql-python模块
方式一 使用yum安装 # yum install MySQL-python 方式二 使用pip 安装 # pip install mysql-python 使用pip方式安装需要提前安装如下依赖 m ...
- JQuery-属性
// attr能访问到的都是html里面的样式,诸如内联样式.外部样式和外联样式该方法访问不到 $('#div1').width('400px') // 这个用来改样式css $("#div ...
- ListView或GridView的Adapter使用Glide加载图片异常
报错信息为:You must not call setTag() on a view Glide is targeting 原因就是View使用setTag后导致Glide之前请求的标记被清除,强制转 ...
- win7下VS2015+opencv3.1.0配置
由于opencv与vs的适配版本不同,本人在官网下载opencv3.1.0,其可以和VS2013.VS2015适配,文中以VS2015为例 opencv2.4.13-----vc11;vc12 ope ...
- awk 合并文件
问题描述:两个文件a.dat, b.dat a.dat 0 100 1 99 2 93 3 90 ... b.dat 0 0 1 3 2 0 3 2 ... ...
- C# 控制台程序(命令行程序)设置字体颜色,窗口宽高,光标行数
控制台程序(命令行程序)设置窗口宽度高度,如下代码: Console.WriteLine(Console.WindowHeight); Console.WriteLine(Console.Buffer ...
- (转载)throw和throws的区别
1.throw:(针对对象的做法)抛出一个异常,可以是系统定义的,也可以是自己定义的.下面举两个例子:抛出Java中的一个系统异常:public class One {public void yich ...
- [原创]java WEB学习笔记99:Spring学习---Spring Bean配置:自动装配,配置bean之间的关系(继承/依赖),bean的作用域(singleton,prototype,web环境作用域),使用外部属性文件
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...