本帖最后由 caolufo 于 2016-8-1 22:20 编辑
写了一下午,终于写出来了。
写一方法,打印等长的二维数组,要求从1开始的自然数由方阵的最外圈向内螺旋方式地顺序排列。 如: n = 4 则打印:
1 2 3 4 12 13 14 5 11 16 15 6 10 9 8 7 从实例n=4写,然后替换为N,替换以后,就完全懵了,自己也看不懂了,但能运行。
import java.util.Scanner;
/**
* 1 2 3 4
* 12 13 14 5
* 11 16 15 6
* 10 9 8 7
*
* 1 2 3
* 8 9 4
* 7 6 5
* 分析规律:
* 第一圈: 【0】【0】-【0】【1】-【0】【2】-【0】【3】 →
* 【1】【3】-【2】【3】-【3】【3】 ↓
* 【3】【2】-【3】【1】-【3】【0】 ←
* 【2】【0】-【1】【0】 ↑
* 第二圈 : 【1】【1】-【1】【2】 →
* 【2】【2】 ↓
* 【2】【1】 ←
* 每一圈同一方向相比,元素个数少2个,2个索引会++或--变化。
* @author caoliang
*/
public class Test8 {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
System.out.println("请输入N(正整数):");
int n=sc.nextInt();
sc.close();
int[][] arr=creatArrary(n);
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr.length; j++) {
System.out.print(arr[j]+"\t");
}
System.out.println();
}
}
/**
* 根据n生成二维数组的方法,按圈数赋值。
* 外循环while控制圈数(→↓←↑为一圈),四个for循环分别为每个方向的数组元素赋值。
* @param int
* @return int[][]
*/
public static int[][] creatArrary(int n) {
int[][] arr = new int[n][n];
int t=1; //通过t,t++为数组元素赋值
int a=0; //一个与圈数相关的变量
while(true){
//根据数组元素个数判定循环结束
if(t>n*n)
break;
//向 右→ 赋值
for(int j=0+a;j<n-a;j++){
arr[0+a][j]=t;
t++;
}
//向 下↓ 赋值
for(int i=1+a;i<n-a;i++){
arr[n-1-a]=t;
t++;
}
//向 左← 赋值
for(int j=n-2-a;j>=0+a;j--){
arr[n-1-a][j]=t;
t++;
}
//向 上↑ 赋值
for(int i=n-2-a;i>=1+a;i--){
arr[0+a]=t;
t++;
}
a++; //下一圈
}
return arr;
}
}
|