49.Algorithm Gossip:

奇数魔方阵

说明

将1到n(为奇数)的数字排列在nxn的方阵上,且各行、各列与各对角线的和必须相同,如下所示:

解法

填魔术方阵的方法以奇数最为简单,第一个数字放在第一行第一列的正中央,然后向右(左)上填,如果右(左)上已有数字,则向下填,如下图所示:

一般程序语言的阵列索引多由0开始,为了计算方便,我们利用索引1到n的部份,而在计算是向右(左)上或向下时,我们可以将索引值除以n值,如果得到余数为1就向下,否则就往右(左)上,原理很简单,看看是不是已经在同一列上绕一圈就对了。

#include #include

#define N 5

int main(void) {inti, j, key;int square[N+1][N+1] = {0};

i= 0;

j= (N+1) / 2;for(key = 1; key <= N*N; key++) {if((key % N) == 1)

i++;else{

i--;

j++;

}if(i == 0)

i=N;if(j >N)

j= 1;

square[i][j]=key;

}for(i = 1; i <= N; i++) {for(j = 1; j <= N; j++)

printf("-", square[i][j]);

}return 0;

}

50.Algorithm Gossip: 4N

魔方阵

说明

与 奇数魔术方阵 相同,在于求各行、各列与各对角线的和相等,而这次方阵的维度是4的倍数。

解法

先来看看4X4方阵的解法:

简单的说,就是一个从左上由1依序开始填,但遇对角线不填,另一个由左上由16开始填,但只填在对角线,再将两个合起来就是解答了;如果N大于2,则以

4X4为单位画对角线:

至于对角线的位置该如何判断,有两个公式,有兴趣的可以画图印证看看,如下所示:

左上至右下:j % 4 == i % 4

右上至左下:(j % 4 + i % 4) == 1

#include #include

#define N 8

int main(void) {inti, j;int square[N+1][N+1] = {0};for(j = 1; j <= N; j++) {for(i = 1; i <= N; i++){if(j % 4 == i % 4 || (j % 4 + i % 4) == 1)

square[i][j]= (N+1-i) * N -j + 1;elsesquare[i][j]= (i - 1) * N +j;

}

}for(i = 1; i <= N; i++) {for(j = 1; j <= N; j++)

printf("-", square[i][j]);

printf("\n");

}return 0;

}

51.Algorithm Gossip:

2(2N+1) 魔方阵

说明

方阵的维度整体来看是偶数,但是其实是一个奇数乘以一个偶数,例如6X6,其中6=2X3,我们也称这种方阵与单偶数方阵。

解法

如果您会解奇数魔术方阵,要解这种方阵也就不难理解,首先我们令n=2(2m+1),并将整个方阵看作是数个奇数方阵的组合,如下所示:

首先依序将A、B、C、D四个位置,依奇数方阵的规则填入数字,填完之后,方阵中各行的和就相同了,但列与对角线则否,此时必须在A-D与C-

B之间,作一些对应的调换,规则如下:

将A中每一列(中间列除外)的头m个元素,与D中对应位置的元素调换。

将A的中央列、中央那一格向左取m格,并与D中对应位置对调

将C中每一列的倒数m-1个元素,与B中对应的元素对调

举个实例来说,如何填6X6方阵,我们首先将之分解为奇数方阵,并填入数字,如下所示:

接下来进行互换的动作,互换的元素以不同颜色标示,如下:

由于m-1的数为0,所以在这个例子中,C-B部份并不用进行对调。

#include #include

#define N 6

#define SWAP(x,y) {int t; t = x; x = y; y = t;}

void magic_o(int [][N], int);void exchange(int [][N], int);int main(void) {int square[N][N] = {0};inti, j;

magic_o(square, N/2);

exchange(square, N);for(i = 0; i < N; i++) {for(j = 0; j < N; j++)

printf("-", square[i][j]);

printf("\n");

}return 0;

}void magic_o(int square[][N], intn) {intcount, row, column;

row= 0;

column= n / 2;for(count = 1; count <= n*n; count++) {

square[row][column]= count; //填A

square[row+n][column+n] = count + n*n; //填B

square[row][column+n] = count + 2*n*n; //填C

square[row+n][column] = count + 3*n*n; //填D

if(count % n == 0)

row++;else{

row= (row == 0) ? n - 1 : row - 1;

column= (column == n-1) ? 0 : column + 1;

}

}

}void exchange(int x[][N], intn) {inti, j;int m = n / 4;int m1 = m - 1;for(i = 0; i < n/2; i++) {if(i !=m) {for(j = 0; j < m; j++) //处理规则 1

SWAP(x[i][j], x[n/2+i][j]);for(j = 0; j < m1; j++) //处理规则 2

SWAP(x[i][n-1-j], x[n/2+i][n-1-j]);

}else { //处理规则 3

for(j = 1; j <= m; j++)

SWAP(x[m][j], x[n/2+m][j]);for(j = 0; j < m1; j++)

SWAP(x[m][n-1-j], x[n/2+m][n-1-j]);

}

}

}

java魔方阵_魔方阵 Java实现转载相关推荐

  1. java魔方阵_使用Java打印数字组成的魔方阵及字符组成的钻石图形

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

  2. java计算奇数阶魔方阵

    一.提出问题 所谓"奇数阶魔方阵"是指n为不小于3的奇数的魔方阵.这类魔方阵的形式多样,这里我们仅讨论其中的一种形式的正规魔方阵.例如:3阶.5阶和7阶的魔方阵如图3 – 4 所示 ...

  3. 马士兵 java 学习笔记_马士兵java教程笔记1

    ---恢复内容开始--- 前记 虽然已经是个研究生了,但是会的东西还是特别的少 甚至连java都不能说是很会 所以准备从现在开始能好好的学习java 变成java master 标识符 标识符是由字母 ...

  4. java 02-cf_cf活动如何设置java环境变量_如何设置java环境变量

    cf助手怎么连接wifi_连接无线网设置 对于刚刚学习java的win7用户来说,首先要学会安装jdk和配置java环境变量,这是学习java的唯一途径,否则编写的代码运行时会出现bug.关于这一点, ...

  5. java 字符串乱码_这份Java面试题含答案解析竟然真的让你不用在面试上“如履薄冰”...

    面试题集共分为以下十部分: 一.Core Java: 1 - 95 题1 - 24 页 基础及语法: 1 - 61 题1 - 13 页 异常: 62 - 69 题13 - 15 页 集合: 70 - ...

  6. java console 交互_实例讲解java中Console类的用法

    java的Console类的使用方法及实例 java的Console类的使用方法及实例 JDK 6中提供了java.io.Console类专用来访问基于字符的控制台设备.如果你的Java程序要与Win ...

  7. java for循环_愉快地学Java语言:第五章 循环

    导读 本文适合Java入门,不太适合Java中高级软件工程师.本文以<Java程序设计基础篇>第10版为蓝本,采用不断提出问题,然后解答问题的方式来讲述.本篇文章只是这个系列中的一篇,如果 ...

  8. java 内存空间_怎样用java实现存储空间动态分配

    1.java是如何管理内存的 Java的内存管理就是对象的分配和释放问题.(两部分) 分配 :内存的分配是由程序完成的,程序员需要通过关键字new 为每个对象申请内存空间 (基本类型除外),所有的对象 ...

  9. linux java远程调试_[转]JPDA:Java平台调试架构(常用的远程调试方法)

    原文出处:http://www.javaeye.com/topic/75128 最近使用WTP的Server功能很不爽,连tomcat服务器时java类中的任何改动都要重启服务器,一怒之下就改用JPD ...

最新文章

  1. 从寄存器看I386和x64位中函数调用中参数传递
  2. 使用isql连接Sybase ASE数据库的常见错误及处理方式
  3. 麻烦大家看了我的文章觉得有用就关注我下
  4. 【Android 安装包优化】使用 lib7zr.so 动态库处理压缩文件 ( 测试 lib7zr.so 动态库调用 )
  5. 用cmake编译caffe
  6. TIP 2018论文概述:基于深度学习的HEVC复杂度优化
  7. linux操作系统信号捕捉函数之回调函数小结
  8. McCabe环路复杂度计算方法
  9. java服务器开发(一)
  10. 怎么把电脑上的python软件卸载干净_怎么把一个软件卸载干净_把一个软件卸载干净的两种方法-系统城...
  11. excel合并单元格和左对齐
  12. 音乐智能推荐 ALS算法
  13. 5GNR漫谈12:PRACH随机接入信道(2)
  14. 上车了!AR摩托车头盔了解一下?
  15. C++基础 Data类的实现
  16. 使用jQuery,写一个简单的轮播图,实现切换功能!
  17. R语言包(package)以及相关命令语句
  18. c语言字节的高地位互换,c语言面试题目100及最佳答案(51页)-原创力文档
  19. 2022-8-15 第七小组 学习日记 (day39)Mysql数据库
  20. 各国电源插头标准和电压标准

热门文章

  1. js pixi框架 极其详细到位(入门)-----转载
  2. 【笔记】行测——常识判断之文史常识总结与归纳(三)
  3. 写在2019年末的一些话
  4. C++程序设计案例实训教程第10章
  5. 使用Loadrunner工具进行录制和回放的详细步骤及界面介绍
  6. java日期格式汇总
  7. Python实现QQ PC端给好友发送消息
  8. C# web.config中的连接字符串中关于 providerName 特性
  9. jx2日志检查bat
  10. java设置文本框颜色_java Swing设置文本框文字颜色和字体