java编程-九宫格问题
2011-03-14 11:41
309 查看
要求:根据输入的数字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
如下是改程序的实现:
import java.util.Scanner;
public class Glorin{
public static void main(String[] args)
{
Scanner s = new Scanner(System.in);
System.out.print("请输入一个为正奇数的阶数:");
int x = s.nextInt(); //输入长度
int h = 0; //行
//在距阵中,1在第一行正中
int l = x / 2; //列
int[][] a = new int[x][x];
for (int i = 1; i <= x * x; i++)
{
a[h][l] = i; //运行提示溢出
//随后的数字应放到上一个数字的右上方方格中
h--;
l++;
//3.如果都不行,就放到上一个数字的正下方
if (h < 0 && l >= x)
{
//先返回上一个数字
h++;
l--;
//再下移一行
h++;
}
//1.如果向上不行,就放到该列的最下方格子
else if (h < 0)
{
h = x - 1;
}
//2.如果向右不行,就放到该行的最左边
else if (l >= x)
{
l = 0;
}
//4.如果目标格子中已经有数字,也放到上一个数字的正下方
else if (a[h][l] > 0)
{
//先返回上一个数字
h++;
l--;
//再下移一行
h++;
}
}
//打印九宫格
for (int j = 0; j < x; j++)
{
for (int k = 0; k < x; k++)
{
System.out.print(a[j][k] + " ");
}
//换行
System.out.println();
}
}
}
预备知识:
在距阵中,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
如下是改程序的实现:
import java.util.Scanner;
public class Glorin{
public static void main(String[] args)
{
Scanner s = new Scanner(System.in);
System.out.print("请输入一个为正奇数的阶数:");
int x = s.nextInt(); //输入长度
int h = 0; //行
//在距阵中,1在第一行正中
int l = x / 2; //列
int[][] a = new int[x][x];
for (int i = 1; i <= x * x; i++)
{
a[h][l] = i; //运行提示溢出
//随后的数字应放到上一个数字的右上方方格中
h--;
l++;
//3.如果都不行,就放到上一个数字的正下方
if (h < 0 && l >= x)
{
//先返回上一个数字
h++;
l--;
//再下移一行
h++;
}
//1.如果向上不行,就放到该列的最下方格子
else if (h < 0)
{
h = x - 1;
}
//2.如果向右不行,就放到该行的最左边
else if (l >= x)
{
l = 0;
}
//4.如果目标格子中已经有数字,也放到上一个数字的正下方
else if (a[h][l] > 0)
{
//先返回上一个数字
h++;
l--;
//再下移一行
h++;
}
}
//打印九宫格
for (int j = 0; j < x; j++)
{
for (int k = 0; k < x; k++)
{
System.out.print(a[j][k] + " ");
}
//换行
System.out.println();
}
}
}
相关文章推荐
- 生产者和消费者的经典问题 java编程实现
- JAVA编程中关于类型转换的问题
- c程序(打印日历、数转成素数乘积、猜随机数、九宫格,汉诺塔问题、main中命令行参数)
- 九宫格问题
- JAVA编程中需注意的问题
- 深入剖析Java编程中的中文问题及建议最优解决方法(1)
- JAVA编程中异常问题处理方式的区别和分析
- Java编程中遇到的数据转换问题
- java编程遇到的几个代码问题
- 2016/1/10 作业 1, 二维数组遍历输出求和 2,转置运算???? 3,九宫格?? 后两个存在问题
- 九宫格问题(回溯的多种写法,Go语言实现)
- java编程中拷贝数组的方式及相关问题分析
- java编程中的问题及解决问题
- 深入剖析Java编程中的中文问题及建议最优解决方法
- 解决java编程乱码问题
- JAVA编程中异常问题处理方式的区别和分析
- JAVA编程之古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子
- JAVA编程中异常问题处理方式的区别和分析
- java编程中遇到的时区与时间问题总结
- Android开发中,9-patch (九宫格)图片作为背景带来的问题