黑马程序员技术交流社区
标题:
内螺旋方式地顺序排列
[打印本页]
作者:
遇见未来2016
时间:
2016-5-28 08:48
标题:
内螺旋方式地顺序排列
写一方法,打印等长的二维数组,要求从1开始的自然数由方阵的最外圈向内螺旋方式地顺序排列。
如: n = 4 则打印:
作者:
huburt
时间:
2016-5-28 08:50
public static void main(String[] args) {
//调用方法,获取数组并打印
printMetirx(getMetirx(4));
}
// 打印数组的方法
public static void printMetirx(int[][] metirx) {
// 二维数组实际上外层是一个数组的数组,元素是int[]数组
// 循环访问外层数组的元素
for (int i = 0; i < metirx.length; i++) {
// 访问到的外层数组的元素:int[]数组
// 在循环访问内层数组
for (int j = 0; j < metirx[i].length; j++) {
// 打印对应元素
System.out.print(metirx[i][j]);
// 添加空格
System.out.print("\t\t");
}
// 外层数组的元素单独显示一行,即一个int[]数组显示在一行
System.out.print('\n');
}
}
/**
* @param n 二维数组的大小
* @return int[n][n] 返回一个螺旋矩阵
*
* @author 思路:按“口”字形赋值,先给最外层一圈赋值,再给第二圈赋值....直至结束。
* 用上下左右四个顶点的位置来确定“口”的大小。
* 每次赋值完成一条边,对应的顶点往中心靠拢。
*/
public static int[][] getMetirx(int n) {
// 创建二维数组
int[][] metirx = new int[n][n];
// 赋值圈数
int count = (n + 1) / 2;
// 起始数
int start = 1;
// “口”字形圈的四个顶点
int left = 0, right = n - 1, top = 0, botton = n - 1;
// 赋值次数,即圈数
for (int i = 0; i < count; i++) {
// 给上边缘赋值,从左往右
for (int x = left; x <= right; x++) {
metirx[top][x] = start++;
}
// 上顶点往下移
top++;
// 给右边缘赋值,从上往下
for (int y = top; y <= botton; y++) {
metirx[y][right] = start++;
}
// 右顶点往左移
right--;
// 给下边缘赋值,从右往左
for (int x = right; x >= left; x--) {
metirx[botton][x] = start++;
}
// 下顶点往上移
botton--;
// 给左边缘复制,从下往上
for (int y = botton; y >= top; y--) {
metirx[y][left] = start++;
}
// 左顶点往右移
left++;
}
// 返回赋值完成的二维矩阵
return metirx;
}
复制代码
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2