📄 oddarray.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>奇数魔方阵</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: 奇数魔方阵</a></h1>
<h2>说明</h2>
将1到n(为奇数)的数字排列在nxn的方阵上,且各行、各列与各对角线的和必须相同,如下所示:<br>
<div style="text-align: center;"><img style="width: 115px; height: 79px;" alt="奇数魔方阵" title="奇数魔方阵" src="images/oddArray-1.jpg"><br>
<div style="text-align: left;">
<h2> 解法</h2>
</div>
<div style="text-align: left;">填魔术方阵的方法以奇数最为简单,第一个数字放在第一行第一列的正中央,然后向右(左)上填,如果右(左)上已有数字,则向下填,如下图所示: <br>
<div style="text-align: center;"><img style="width: 198px; height: 194px;" alt="奇数魔方阵" title="奇数魔方阵" src="images/oddArray-2.jpg"><br>
</div>
</div>
</div>
一般程式语言的阵列索引多由0开始,为了计算方便,我们利用索引1到n的部份,而在计算是向右(左)上或向下时,我们可以将索引值除以n值,如果得到余数为1就向下,否则就往右(左)上,原理很简单,看看是不是已经在同一列上绕一圈就对了。 <br>
<br>
<h2> 实作</h2>
<ul>
<li> C
</li>
</ul>
<pre>#include <stdio.h> <br>#include <stdlib.h> <br><br>#define N 5 <br><br>int main(void) { <br> int i, j, key; <br> int square[N+1][N+1] = {0}; <br><br> i = 0; <br> j = (N+1) / 2; <br><br> for(key = 1; key <= N*N; key++) { <br> if((key % N) == 1) <br> i++; <br> else { <br> i--; <br> j++; <br> } <br><br> if(i == 0) <br> i = N; <br> if(j > N) <br> j = 1; <br><br> square[i][j] = key; <br> } <br><br> for(i = 1; i <= N; i++) { <br> for(j = 1; j <= N; j++) <br> printf("%2d ", square[i][j]); <br> } <br><br> return 0; <br>} <br></pre>
<br>
<ul>
<li> Java
</li>
</ul>
<pre>public class Matrix {<br> public static int[][] magicOdd(int n) {<br> int[][] square = new int[n+1][n+1]; <br><br> int i = 0; <br> int j = (n+1) / 2; <br><br> for(int key = 1; key <= n*n; key++) { <br> if((key % n) == 1) <br> i++; <br> else { <br> i--; <br> j++; <br> } <br><br> if(i == 0) <br> i = n; <br> if(j > n) <br> j = 1; <br><br> square[i][j] = key; <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.magicOdd(5);<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>}<br></pre>
<br>
</body>
</html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -