站内搜索: 请输入搜索关键词

当前页面: 开发资料首页J2SE 专题算法问题-二维数组 横向 纵向 对角线相加和相等

算法问题-二维数组 横向 纵向 对角线相加和相等

摘要: 算法问题-二维数组 横向 纵向 对角线相加和相等


如 n为大于3的奇数,用1 - n^2 填充数组, 有什么高效方法求出所有的排列情况

如 n=3 时有 8种,下面是其中一种


6 7 2
1 5 9
8 3 4

横向 纵向 对角线 相加都为15



n=3 时有 8种
n=5 时有 16种,求出一种旋转一下就行了
关键是怎么求出第一种

mark下,等强人


恩,找出第一种最重要
mark


看一下MatLab里的magic(n)是怎么写的


潜力帖


看见算法就头疼



我不知道该怎么旋转一种来得到N种。
但是我知道如何得到一种,不知道符不符合条件。
请允许我吃饭先……


一种很好得到,请问怎么旋转
--------
得到一种的方法:用1 2 3 4 5 6...依次填充数组即可,一个个往下看你就能找到规律。






中间的数是n^2/2+1
和是(1+2+...+n^2)/n




public static void calc(int n) {
int x0 = 0;
int y0 = (n-1) / 2;
int arr[][] = new int[n][n];

for (int i = 1; i <= n * n; i++) {
arr[y0][x0] = i;
if (i% n == 0) {
x0++;
} else {
y0--;
x0--;
}
if (y0 < 0) {
y0 = n - 1;
}
if (x0 < 0) {
x0 = n - 1;
}
}

for(int i=0;ifor(int j=0;jSystem.out.print(arr[i][j]+ " ");
}
System.out.println();
}
}

public static void main(String[] args) {
calc(3);
}




public static void main(String[] args) {
printMatrix(7);
}

public static void printMatrix(int n) {
int[][] matrix = new int[n][n];
int x = (n - 1) / 2;
int y = n - 1;
for (int i = 1; i <= n * n; i++) {
matrix[y][x] = i;
if (i % n == 0) {
y = (y += (n - 1)) % n;
} else {
x = (x += 1) % n;
y = (y += 1) % n;
}
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
System.out.print(matrix[i][j] + " ");
}
System.out.println();
}
}


n=5时
15 16 22 3 9
8 14 20 21 2
1 7 13 19 25
24 5 6 12 18
17 23 4 10 11
--------------
n=7时
28 29 37 45 4 12 20
19 27 35 36 44 3 11
10 18 26 34 42 43 2
1 9 17 25 33 41 49
48 7 8 16 24 32 40
39 47 6 14 15 23 31
30 38 46 5 13 21 22
---------------------------
中间的数是 (n^2+1)/2
和是 (n^2+1)/2 * n
--------
对吗?




一样一样的。
你从左侧中间开始填,我从下方中间开始填而已。
但是我不理解怎么做到旋转求种类?


你的图以y = x为轴翻180度就是我能得到的。

这种图,靠翻转,似乎只能以y = x、 y = -x、 y = 0、 x = 0四条通过图中心的轴翻转。
也就是八种。
那么二楼jlusdy(LOST)所说n = 5时的16种从哪里来?


不对,我想的还是不完整。


怎么想到的
好奇妙啊


目前我只想到把"1"从四条边的中间位置开始填
比如 n=5时:

1 在左边时
arr[2][0] =1,向左上和左下填

1在上边时
arr[0][2]=1,向左上和右上填

1在右边时
arr[2][4]=1,向右上和右下填

1在下边时
arr[0][2]=1,向左下和右下填

和楼上兄弟说的一样只有8种。

但n=5,n=7...时肯定不止8种,哪位高手支支招
如果实在不行的话写一个较高效的穷举算法,把 n=5,n=7,n=9的情况全部列出来,就可以找到规律了



对不住啊
没怎么想就随便说了16种

偶笨想一下
1的位置有四种,每种可以对称变换
所以应该是8种吧



没有人能回答吗?


你找一下幻方的算法


http://bbs.cpcw.com/viewthread.php?tid=712690&extra=page%3D3
这有个c语言版的幻方算法


↑返回目录
前一篇: 为什么在接口中定义的toString()方法可以不被实现?
后一篇: 怎么让文本框里的时间动起来 急救