Java和JavaScript实现扩展的九宫格算法

要求:根据输入的数字n,如:3,5,7…以矩阵显示n行n列数,这些数由1~n*n构成,要求矩阵的每行每列及对角线上n个数之和相等
预备知识:
在距阵中,1在第一行正中,随后的数字应放到上一个数字的右上方方格中,如果向上不行,就放到该列的最下方格子;如果向右不行,就放到该行的最左边;如果都不行,就放到上一个数字的正下方;如果目标格子中已经有数字,也放到上一个数字的正下方

思路:
1) 使用2维数组预备存储1~n*n这些数字
2) 1是放到第一行正中的,所以其索引号是:[0][(n-1)/2]
3) 随后的数字,其索引号原则如下
     1> num的行索引为 num-1 的 (行索引-1) ,  num的列索引为 num-1 的 (列索引+1)
     2>如果发现num的行,列索引都越位(-1或n),则
           num的行索引为 num-1 的 (行索引+1) ,  num的列索引为 num-1 的 (列索引)
     3>如果发现num的行,列索引指向的位置已经有数字,则
           num的行索引为 num-1 的 (行索引+1) ,  num的列索引为 num-1 的 (列索引)
     4>如果发现num的行越位(-1),则
           num的行索引为n-1
     5>如果发现num的列越位(n),则
           num的列索引为0

下面是Java和JavaScript的实现

*******************************************************************************************

Grid9.java
—————————————————

import java.util.Scanner;

class Grid9 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println (“请输入行数:”);
int n = sc.nextInt();
System.out.println ();
//n必须为奇数
if(n%2==0)
n–;
//n必须大于等于3
if(n<3)
n = 3;
//创建数组–>类似双层集合,可像使用多维数组一样式样它
//所有成员初始化为 0
int[][] ary = new int[n][n];
//一行正中的位置
int mid = (n-1)/2;
//当前数字
int num = 1;
//当前行,列
int currRow = 0;
int currCol = mid;
//下一行,列
int nextRow,nextCol;
while(num<=n*n) {
ary[currRow][currCol] = num;
num++; //下一个数
nextRow = currRow-1; //下一个数的行索引
nextCol = currCol+1; //下一个数的列索引
//如果下一个数字的行和列的索引都不合法,行索引变为 (当前数字的行索引+1),列索引变为 (当前数字的列索引)
if(nextRow<0 && nextCol>=n) {
nextRow = currRow+1;
nextCol = currCol;
}
//如果下一个数字的行索引小于0,就把其行索引变为 (5-1)
else if(nextRow<0) {
nextRow = n-1;
}
//如果下一个数字的列索引等于5,就把其列索引变为 (0)
else if(nextCol>=n) {
nextCol = 0;
}
//如果本应放下一个数字的位置已经有值的话,行索引变为 (当前数字的行索引+1),列索引变为 (当前数字的列索引)
else if(ary[nextRow][nextCol]>0) {
nextRow = currRow+1;
nextCol = currCol;
}
//将当前行列改为下一行的行列,准备存储下一个数字
currRow = nextRow;
currCol = nextCol;
}
//打印9宫格数据
for(int i=0;i<n;i++) {
for(int j=0;j<n;j++) {
System.out.print(ary[i][j] + “/t”);
}
System.out.println();
}
}
}

*******************************************************************************************

Grid9.html
—————————————————

<script>
var n = prompt(“请输入行数:”,”3″);
n = parseInt(n);

//n必须为奇数
if(n%2==0)
n–;

//n必须大于等于3
if(n<3)
n = 3;
//创建数组–>类似双层集合,可像使用多维数组一样式样它
//所有成员初始化为 0
var ary = new Array();
var aryLine;
for(var i=0;i<n;i++) {
aryLine = new Array(n);
ary.push(aryLine);
}
//一行正中的位置
var mid = (n-1)/2;

//当前数字
var num = 1;

//当前行,列
var currRow = 0;
var currCol = mid;

//下一行,列
var nextRow,nextCol;

while(num<=n*n) {
ary[currRow][currCol] = num;
num++; //下一个数
nextRow = currRow-1; //下一个数的行索引
nextCol = currCol+1; //下一个数的列索引
//如果行和列的索引都不合法,行索引变为 (当前数字的行索引+1),列索引变为 (当前数字的列索引)
if(nextRow<0 && nextCol>=n) {
nextRow = currRow+1;
nextCol = currCol;
}
//如果下一个数字的行索引小于0,就把其行索引变为 (5-1)
else if(nextRow<0) {
nextRow = n-1;
}
//如果下一个数字的列索引等于5,就把其列索引变为 (0)
else if(nextCol>=n) {
nextCol = 0;
}
//如果本应放下一个数字的位置已经有值的话,行索引变为 (当前数字的行索引+1),列索引变为 (当前数字的列索引)
else if(ary[nextRow][nextCol]!=null) {
nextRow = currRow+1;
nextCol = currCol;
}
//将当前行列改为下一行的行列,准备存储下一个数字
currRow = nextRow;
currCol = nextCol;
}

document.write(“<table border=’1′>”);
for(var i=0;i<n;i++) {
document.write(“<tr>”);
for(var j=0;j<n;j++) {
document.write(“<td>” + ary[i][j] + “</td>”);
}
document.write(“</tr>”);
}
document.write(“</table>”);
</script>

    原文作者:九宫图算法
    原文地址: https://blog.csdn.net/nimmy/article/details/3428412
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞