📄 fournarray.htm
字号:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<link rel="stylesheet" href="css/stdlayout.css" type="text/css">
<link rel="stylesheet" href="css/print.css" type="text/css">
<meta content="text/html; charset=gb2312" http-equiv="content-type">
<title>4N 魔方阵</title>
</head>
<body>
<h3><a href="http://caterpillar.onlyfun.net/GossipCN/index.html">From
Gossip@caterpillar</a></h3>
<h1><a href="AlgorithmGossip.htm">Algorithm Gossip: 4N 魔方阵</a></h1>
<h2>说明</h2>
与 <a href="OddArray.htm">奇数魔术方阵</a> 相同,在于求各行、各列与各对角线的和相等,而这次方阵的维度是4的倍数。<br>
<h2>解法</h2>
先来看看4X4方阵的解法: <br>
<div style="text-align: center;"><img style="width: 423px; height: 117px;" alt="4N 魔方阵" title="4N 魔方阵" src="images/fourNArray-1.jpg"><br>
<br>
<div style="text-align: left;">简单的说,就是一个从左上由1依序开始填,但遇对角线不填,另一个由左上由16开始填,但只填在对角线,再将两个合起来就是解答了;如果N大于2,则以 4X4为单位画对角线: <br>
<div style="text-align: center;"><img style="width: 528px; height: 232px;" alt="4N 魔方阵" title="4N 魔方阵" src="images/fourNArray-2.jpg"></div>
<br>
至于对角线的位置该如何判断,有两个公式,有兴趣的可以画图印证看看,如下所示:<br>
<div style="margin-left: 40px;"><span style="font-weight: bold; font-family: Courier New,Courier,monospace;">左上至右下:j % 4 == i % 4</span><br style="font-weight: bold; font-family: Courier New,Courier,monospace;">
<span style="font-weight: bold; font-family: Courier New,Courier,monospace;">右上至左下:(j % 4 + i % 4) == 1 </span><br>
</div>
<br>
<h2> 实作</h2>
<ul>
<li> C
</li>
</ul>
<pre>#include <stdio.h> <br>#include <stdlib.h> <br><br>#define N 8 <br><br>int main(void) { <br> int i, j; <br> int square[N+1][N+1] = {0}; <br><br> for(j = 1; j <= N; j++) { <br> for(i = 1; i <= N; i++){ <br> if(j % 4 == i % 4 || (j % 4 + i % 4) == 1) <br> square[i][j] = (N+1-i) * N -j + 1; <br> else <br> square[i][j] = (i - 1) * N + j; <br> } <br> } <br><br> for(i = 1; i <= N; i++) { <br> for(j = 1; j <= N; j++) <br> printf("%2d ", square[i][j]); <br> printf("\n"); <br> } <br><br> return 0; <br>} <br></pre>
<br>
<ul>
<li> Java
</li>
</ul>
<pre>public class Matrix {<br> public static int[][] magicFourN(int n) {<br> int[][] square = new int[n+1][n+1]; <br><br> for(int j = 1; j <= n; j++) { <br> for(int i = 1; i <= n; i++){ <br> if(j % 4 == i % 4 || (j % 4 + i % 4) == 1) <br> square[i][j] = (n+1-i) * n -j + 1; <br> else <br> square[i][j] = (i - 1) * n + j; <br> } <br> } <br> <br> int[][] matrix = new int[n][n];<br> <br> for(int k = 0; k < matrix.length; k++) {<br> for(int l = 0; l < matrix[0].length; l++) {<br> matrix[k][l] = square[k+1][l+1];<br> }<br> }<br> <br> return matrix;<br> }<br> <br> public static void main(String[] args) {<br> int[][] magic = Matrix.magicFourN(8);<br> for(int k = 0; k < magic.length; k++) {<br> for(int l = 0; l < magic[0].length; l++) {<br> System.out.print(magic[k][l] + " ");<br> }<br> System.out.println();<br> }<br> }<br>} </pre>
</div>
</div>
</body>
</html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -