生活终于对我这只小猫咪下手了。
让我们敲几行代码提提神,压压惊。
让我们先来认识一下什么是螺旋数组。
形如 和 这种 按顺序输入的二维数组,会以顺时针螺旋排列 输出。
我们现在希望输入一个整数 n ,建立一个 n x n 的螺旋数组并输出。
例如 我们输入3 输出
OK,让我们开始分析一下。
每一次放入数组的顺序数字很好实现,每次加一即可。
难点在于放入数组的数字需要拐弯,这样放入的顺序问题。
对于这样的问题,我们可以定义一个变量,让他表示放入数字的方向,
观察可得到我们每个螺旋数组都是先向右创建,再向下创建
在这里我们使用 0代表向下 , 1代表向左 , 2代表向上 , 3代表向右,每次改变,这个变量加一取余
我们在以4x4的螺旋数组为例子分析。
我们可以认为,在创建的第一步,将第一行的4个数字( 1,2,3,4)输出;第二步,输出第四列的3个数字(5,6,7);第三步,打印第4行的3个数字(8,9,10);第四步,打印第一列的2个数字(11,12);第五步,打印第2行的两个数字(13,14);第六步打印第3列的1个数字(15);第七部打印第3行的一个数字(16)。
对以上过程进行总结规律,可以得出,在第一步的时候,向右打印n个数字,第二步第三步,向下和向左的分别打印 n -1 个数字,第四步第五步,向上向右分别打印 n-2 个数字。 将第一步除外,向下和向左打印的数字个数一样,,向上和向右打印的数字个数一样。由此我们可以码出一个类。
class Liule {
void setMap(int e) {
int [][]arr = new int [e][e];
int ne = e-1,te = e;
int i = 0,j = e-1;
int dir = 1;//方向变量
int count = 1;//打印的数字
int c = e*e;//数组的总元素个数。
while(te!=0)
{
arr[i][e-(te--)] = count++;
}
te = ne;
while(count<= c) {
switch(dir) {
case 0 :
while(te!=0) {
te--;
j++;
arr[i][j] = count++;
}
dir = (dir+1)%4;
ne--;
te = ne;
break;
case 1:
while(te!=0) {
te--;
i++;
arr[i][j] = count++;
}
dir = (dir+1)%4;
te = ne;
break;
case 2:
while(te!=0) {
te--;
j--;
arr[i][j] = count++;
}
dir = (dir+1)%4;
ne--;
te = ne;
break;
case 3:
while(te!=0) {
te--;
i--;
arr[i][j] = count++;
}
dir = (dir+1)%4;
te = ne;
break;
default:
break;
}
}
for(i=0;i<e;i++) {
for(j=0;j<e;j++) {
System.out.print(arr[i][j]+" ");
}
System.out.println("");
}
}
}
在这段代码里定义了 te 和 ne 用来遏制螺旋打印重叠的情况 和 用于数组边长的储存。
之后直接在main函数里调用。完整代码如下
package com.zzu.hw;
import java.util.Scanner;
public class Hw81500 {
public static void main(String[] args) {
Liule ane = new Liule();
Scanner scan = new Scanner(System.in);
System.out.println("请输入螺旋数组的大小");
int n = scan.nextInt();
ane.setMap(n);
}
}
class Liule {
void setMap(int e) {
int [][]arr = new int [e][e];
int ne = e-1,te = e;
int i = 0,j = e-1;
int dir = 1;
int count = 1;
int c = e*e;
while(te!=0)
{
arr[i][e-(te--)] = count++;
}
te = ne;
while(count<= c) {
switch(dir) {
case 0 :
while(te!=0) {
te--;
j++;
arr[i][j] = count++;
}
dir = (dir+1)%4;
ne--;
te = ne;
break;
case 1:
while(te!=0) {
te--;
i++;
arr[i][j] = count++;
}
dir = (dir+1)%4;
te = ne;
break;
case 2:
while(te!=0) {
te--;
j--;
arr[i][j] = count++;
}
dir = (dir+1)%4;
ne--;
te = ne;
break;
case 3:
while(te!=0) {
te--;
i--;
arr[i][j] = count++;
}
dir = (dir+1)%4;
te = ne;
break;
default:
break;
}
}
for(i=0;i<e;i++) {
for(j=0;j<e;j++) {
System.out.print(arr[i][j]+" ");
}
System.out.println("");
}
}
}