一个类似的题目
7-5 螺旋方阵(二维数组存储)
输出螺旋方阵,采用二维数组存储。螺旋方阵将从1开始的自然数由方阵的最外圈向内螺旋方式地顺序排列。例如,4阶螺旋方阵有以下两种排列方式,方向不同。
输入格式
螺旋方阵的阶数
输出格式:
1 2 3 4
12 13 14 5
11 16 15 6
10 9 8 7
输入样例:
4
输出样例:
在这里给出相应的输出。例如:
1 2 3 4
12 13 14 5
11 16 15 6
10 9 8 7
代码:
注意:
定义填充方向:向右、向下、向左、向上
(0, 1):向右移动(列号增加,行号不变)。
(1, 0):向下移动(行号增加,列号不变)。
(0, -1):向左移动(列号减少,行号不变)。
(-1, 0):向上移动(行号减少,列号不变)。
int [] dx = {0,1,0,-1};
int [] dy = {1,0,-1,0};
// package com.yxc;
import java.util.Scanner;
public class Main{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();//n为阶数
int [][] m = new int[n][n];//二维矩阵每个坐标放的数字
//定义填充方向:向右、向下、向左、向上
//(0, 1):向右移动(列号增加,行号不变)。
//(1, 0):向下移动(行号增加,列号不变)。
//(0, -1):向左移动(列号减少,行号不变)。
//(-1, 0):向上移动(行号减少,列号不变)。
int [] dx = {0,1,0,-1};
int [] dy = {1,0,-1,0};
int currentnumber = 1 ; //当前的数字
int x = 0,y = 0 ; //当前坐标
int dirction = 0 ; //初始方向
while(currentnumber <= n*n ){
m[x][y] = currentnumber;
currentnumber++;
int nextX = x + dx[dirction];
int nextY = y + dy[dirction];
if(nextX<0||nextX>=n||nextY<0||nextY>=n||m[nextX][nextY]!=0){
dirction = (dirction+1) % 4 ;
nextX = x + dx[dirction];
nextY = y + dy[dirction];
}
x = nextX;
y = nextY;
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
System.out.printf("%3d ",m[i][j]);
}
System.out.println();
}
}
}