螺旋数组主要是掌握好双 for 循环和二维数组 i j 之间的关系,下面三道题有助于更好的理解,最好还是能把具体的坐标变换亲自写一下,找出之间的规律。
第一题
设计一个二维数组,按图示输出。(蛇形数组)
1 2 6 7
3 5 8 13
4 9 12 14
10 11 15 16
方法一
分析:
分两块处理,先处理左上三角,再处理右下三角
代码:
public class homework_2_3 {
public static void main(String[] args) {
int a[][] = new int[4][4];
int num = 1;
//左上三角
for(int i = 0 ; i < 4 ; i++){
for (int j = 0 ; j <= i ; j++){
if( i % 2 == 0 ){
a[i-j][j] = num;
}else{
a[j][i-j] = num;
}
num += 1;
}
}
//右下三角
for(int i = 0 ; i < 3 ; i++){
for (int j = i+1 ; j < 4 ; j++){
if( i % 2 == 0 ){
a[i-j+4][j] = num;
}else{
a[j][i-j+4] = num;
}
num += 1;
}
}
for (int i = 0; i<a.length ; i++){
for (int j = 0 ; j<a[i].length ; j++){
String str = String.format("%2d ",a[i][j]);
System.out.print(str);
}
System.out.println();
}
}
}
方法二:
分析: (图片晚上补)
代码
public class homework_2_3_1 {
public static final int N = 10;
public static void main(String[] args) {
int a[][] = new int[N][N];
int x = 1;
//最外层循环,为斜向循环的行数
//左上三角
for (int n = 0; n < N ; n++) {
if (n % 2 == 0) {
//偶数行从左下到右上推进
for (int i = n, j = 0; i >= 0; i--, j++) {
a[i][j] = x;
x++;
}
}else {
//奇数行从右上到左下推进
for (int i = 0, j = n; j >= 0; i++, j--) {
a[i][j] = x;
x++;
}
}
}
//右下三角
for (int n = N; n < 2*N-1 ; n++) {
if (n % 2 == 0) {
//偶数行从左下到右上推进
for (int i = N - 1, j = n+1-N ; j <= N-1 ; i--, j++) {
a[i][j] = x;
x++;
}
}else {
//奇数行从右上到左下推进
for (int i = n+1-N , j = N-1; i<=N-1 ; i++, j--) {
a[i][j] = x;
x++;
}
}
}
for (int i = 0; i<a.length ; i++){
for (int j = 0 ; j<a[i].length ; j++){
String str = String.format("%2d ",a[i][j]);
System.out.print(str);
}
System.out.println();
}
}
}
输出:
第二题
设计一个二维数组,按图示输出。
1 2 9 10
4 3 8 11
5 6 7 12
16 15 14 13
分析:
将图形拆成4层,寻找顺序输出的坐标和 i j 输出坐标的关系。
蓝色的字是按照顺序每层输出的坐标,黑色的字是实际双 for 循环输出的坐标,对比关系。
代码实现
缺陷:无法实现指定N输出相应规律图形,仅可以输出题上图形
public class homework_2_4 {
public static void main(String[] args) {
int a[][] = new int[4][4];
int num = 2;
//第一层
a[0][0] =1;
//第二层
for (int i = 0; i< 2; i++){
for (int j = 1; j>=0; j--){
if(i<=0 && j<=0){
}else {
a[i][j] = num;
num +=1;
}
}
}
//第三层
for (int i = 2; i>=0; i--){
for (int j = 0; j< 3; j++){
if(i<=1 && j<=1){
}else {
a[i][j] = num;
num +=1;
}
}
}
//第四层
for (int i = 0; i<4 ; i++){
for (int j = 3; j>=0; j--){
if(i<=2 && j<=2){
}else {
a[i][j] = num;
num +=1;
}
}
}
for (int i = 0; i<a.length ; i++){
for (int j = 0 ; j<a[i].length ; j++){
String str = String.format("%2d ",a[i][j]);
System.out.print(str);
}
System.out.println();
}
}
}
输出:
第三题
设计一个二维数组,按图示输出螺旋状元素:
1 2 3 4 5
16 17 18 19 6
15 24 25 20 7
14 23 22 21 8
13 12 11 10 9
方法借鉴了blog.csdn.net/qq_36631580…
代码:
public class homework_2_5 {
public static void main(String[] args) {
int N = 5;
int a[][] = new int[N][N];
int right = 1,down = 2, left = 3, up = 4;
int d = right;
int m = 0,n = 0;
for(int step = 1 ; step <= N*N ; step++) {
a[m][n] = step;
if (d == right) {
if (n + 1 < N && a[m][n + 1] == 0) {
n++;
} else {
m++;
d = down;
continue;
}
}
if (d == down) {
if (m + 1 < N && a[m + 1][n] == 0) m++;
else {
n--;
d = left;
continue;
}
}
if (d == left) {
if (n - 1 >= 0 && a[m][n - 1] == 0) n--;
else {
m--;
d = up;
continue;
}
}
if (d == up) {
if (m - 1 >= 0 && a[m - 1][n] == 0) m--;
else {
n++;
d = right;
continue;
}
}
}
for (int i = 0; i<a.length ; i++){
for (int j = 0 ; j<a[i].length ; j++){
String str = String.format("%2d ",a[i][j]);
System.out.print(str);
}
System.out.println();
}
}
}
输出: