面试一道题求助各位路过的大侠? 三行三列,第1行第2列固定为1,其它为2-9的数,求横,竖,交叉相加都等于15,输出矩阵??(用数组做)求有人有路子或是做过类似的算法题的给点指点? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 我以前学c语言时,有这个算法,当n为奇数时,算法很简单,n = 偶数时,没做过.(n为几行几列)可以找一下,如果确实很急,我去找一下以前的代码,(手头没有) ==========================奇数阶魔方阵求法==========================(1) 将1放在第一行中间一列;(2) 从2开始直到n×n止各数依次按下列规则存放: 每一个数存放的行比前一个数的行数减1,列数加1(3) 如果上一数的行数为1,则下一个数的行数为n(指最下一行)。例如1在第1行,则2应放在最下一行, 列数同样加1;(4) 当上一个数的列数为n时,下一个数的列数应为1,行数减1。例如2在第3行最后一列,则3应放在第2行第1列;(5) 如果按上面规则确定的位置上已有数,或上一个数是第1行第n列时,则把下一个数放在上一个数的下面。 例如按上面的规定,4应该放在第1行第2列,但该位置已被1占据,所以4就放在3的下面。由于6是第1行第 3列(即最后一列),故7放在6下面。按此方法可以得到任何阶的魔方阵。*/import java.io.*;public class MagicMatrix { public static void main(String[] args){ // 输入阶数 int n = 0; // 获取控制台输入 BufferedReader input = new BufferedReader( new InputStreamReader(System.in)); while(n<3 || (n&1)==0) { try { // 获取阶数。 System.out.println("请输入一个大于3的奇数!"); n = Integer.parseInt(input.readLine()); } catch (NumberFormatException e) { // 格式错误,重输 System.out.println("请输入一个大于3的奇数!"); continue; } catch (IOException e) { System.out.println("程序发生异常错误将被关闭!"); e.printStackTrace(); } } int a[][] = new int[n][n]; int i=0; int j=n>>1; // 初始化第一个位置为第一行中位置 a[i][j] = 1; // 按向右上的斜线填充 for( int k=2; k <= n*n; ++k ) { i = (i + n - 1) % n; // 循环上移一行 j = (j + 1) % n; // 循环右移一列 if( a[i][j] != 0 ) // 该位置已有数值,到上一数的下一行 { i = (i + 2) % n; // 下移二行 j = (j + n -1 ) % n; // 左移一列 } a[i][j] = k; } for(i = 0; i < n; ++i) { for(j = 0; j < n; ++j) { System.out.print(a[i][j] + "\t"); } System.out.println(); } }} 一个小菜鸟的一碟小菜---关于查询的问题 询问下public问题 关于ant 问个简单的java问题关于iterator 有关NumberFormat.format(double number, StringBuffer toAppendTo, FieldPosition pos) 的用法 大家帮忙,线程的死锁代码我看不懂,感谢 请高手指点:能用jcreator编写swt程序吗? 求core java 中文译本 一个关于类名的提示,搞不懂 小弟求救! 问题很简单。。。 帮我看看这段代码,为什么运行的时候有错误啊
可以找一下,如果确实很急,我去找一下以前的代码,(手头没有)
奇数阶魔方阵求法
==========================(1) 将1放在第一行中间一列;
(2) 从2开始直到n×n止各数依次按下列规则存放:
每一个数存放的行比前一个数的行数减1,列数加1
(3) 如果上一数的行数为1,则下一个数的行数为n(指最下一行)。例如1在第1行,则2应放在最下一行,
列数同样加1;
(4) 当上一个数的列数为n时,下一个数的列数应为1,行数减1。例如2在第3行最后一列,则3应放在第2行第1列;
(5) 如果按上面规则确定的位置上已有数,或上一个数是第1行第n列时,则把下一个数放在上一个数的下面。
例如按上面的规定,4应该放在第1行第2列,但该位置已被1占据,所以4就放在3的下面。由于6是第1行第
3列(即最后一列),故7放在6下面。按此方法可以得到任何阶的魔方阵。
*/import java.io.*;public class MagicMatrix {
public static void main(String[] args){
// 输入阶数
int n = 0;
// 获取控制台输入
BufferedReader input = new BufferedReader(
new InputStreamReader(System.in));
while(n<3 || (n&1)==0) {
try {
// 获取阶数。
System.out.println("请输入一个大于3的奇数!");
n = Integer.parseInt(input.readLine());
}
catch (NumberFormatException e) {
// 格式错误,重输
System.out.println("请输入一个大于3的奇数!");
continue;
}
catch (IOException e) {
System.out.println("程序发生异常错误将被关闭!");
e.printStackTrace();
}
}
int a[][] = new int[n][n];
int i=0;
int j=n>>1; // 初始化第一个位置为第一行中位置
a[i][j] = 1;
// 按向右上的斜线填充
for( int k=2; k <= n*n; ++k )
{
i = (i + n - 1) % n; // 循环上移一行
j = (j + 1) % n; // 循环右移一列
if( a[i][j] != 0 ) // 该位置已有数值,到上一数的下一行
{
i = (i + 2) % n; // 下移二行
j = (j + n -1 ) % n; // 左移一列
}
a[i][j] = k;
}
for(i = 0; i < n; ++i) {
for(j = 0; j < n; ++j) {
System.out.print(a[i][j] + "\t");
}
System.out.println();
}
}
}