黑马程序员技术交流社区
标题:
谁能帮解下这道题
[打印本页]
作者:
15242694137
时间:
2016-6-29 22:24
标题:
谁能帮解下这道题
写一方法,打印等长的二维数组,要求从1开始的自然数由方阵的最外圈向内螺旋方式地顺序排列。
作者:
小雨皮
时间:
2016-7-1 18:05
public class tt {
public static void main(String[] args) {
int[][] arr = arrs();
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr[i].length; j++) {
if(arr[i][j]<10)
System.out.print("0"+arr[i][j]+ " ");
else
System.out.print(arr[i][j]+ " ");
}
System.out.println();
}
}
public static int[][] arrs() {
// System.out.println("请输入方阵行数或列数:");
// Scanner sc=new Scanner(System.in);
// int le=sc.nextInt();// 数组长度
int le=9;
// System.out.println("请检查方阵是否正确");
int arr[][] = new int[le][le];
int x = 0;// 小数组下标,横向
int y = 0;// 数组下标,纵向
int n = 1;// 显示数字
// 螺旋顺序是右》下》左》上》右。。
int c = 0;// 圈数从最外面是第一圈c=0
int t = 1;// 1右2下3左4上
boolean b=true;
while(b){
while (t == 1 && x < le - c && x >= c) {
arr[y][x++] = n++;
//x++;
//n++;
if (x == le - c) {
t = 2;
}
if (n == le * le+1)
b=false;
}
x = le - c - 1;
y = c + 1;
while (t == 2 && y > c && y < le - c) {
arr[y++][x] = n++;
//y++;
//n++;
if (y == le - c) {
t = 3;
}
if (n == le * le+1)
b=false;
}
y = le - c - 1;
x = le - c - 2;
while (t == 3 && x < le - c - 1 && x >= c) {
arr[y][x--] = n++;
//n++;
//x--;
if (x < c) {
t = 4;
}
if (n == le * le+1)
b=false;
}
x = c;
y = le - c - 2;
while (t == 4 && y > c && y < le - c - 1) {
arr[y--][x] = n++;
//y--;
//n++;
if (y == c) {
t = 1;
c++;
}
if (n == le * le+1)
b=false;
}
x = c;
y = c;
}
return arr;
}
}
复制代码
作者:
小雨皮
时间:
2016-7-1 18:13
public class text {
public static void main(String[] args) {
// 根据n创建一个二维数组
int n = 5;
int[][] arr = new int[n][n];
// 调用数组赋值的方法
method(arr);
// 将数组遍历出来
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr.length; j++) {
System.out.print(arr[i][j] + "\t");
}
System.out.println("\n");
}
}
// 二维数组赋值方法
public static void method(int[][] arr) {
// 创建数组的两个索引变量
int i = 0;
int j = 0;
// 通过 max 和min控制索引i,j的变化
int max = arr.length - 1;
int min = 0;
// 所需要赋的值
int num = 1;
while (min <= max) {
// 1、i不变j++ 向右
while (j < max) {
arr[i][j++] = num++;
}
// 2、j不变i++ 向下
while (i < max) {
arr[i++][j] = num++;
}
// 3、i不变j-- 向左
while (j > min) {
arr[i][j--] = num++;
}
// 4、j不变i-- 向上
while (i > min) {
arr[i--][j] = num++;
}
// 由于可能在n为奇数的时候无法为中心那个数赋值所以要补上这个数的赋值
if (min == max) {
arr[i][j] = num;
}
max--;
min++;
// 循环一圈又开始想有赋值j++
j++;
// 由于向上的时候最后一次赋值i多减了一次所以每次外循环都要将i补回来
i++;
}
}
}
复制代码
这个是别人写的属于简单方法,不过大体思路是一样的都是,从外面一圈圈循环先给数组赋值,这个每一圈赋值的长度都一样(好看懂),上面的我感觉你要是看懂了应该理解的会更深点
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2