输入两个正整数表示矩阵的行列数,输出蛇形矩阵。
如
该题思路是采用坐标输出数字,通过改变坐标来输出下一个数字。假设(0,0)为第一个数字的坐标,
那么第一行的数字x不变y依次加一,记→x:0,y:+1;然后撞墙改变方向,记↓x:+1,y:0;然后再次向左改变方向,记←x:0,y:-1;然后再次向上改变方向,记x:-1,y:0;把四个方向一次用0,1,2,3表示。
import java.util.Scanner;
public class test2 {
public static void main(String[] args) {
final int N=110;
boolean[][] st=new boolean[N][N];//表示是否已经存在数字
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int m = sc.nextInt();//输入两个数字
int[][] arr = new int[N][N];//初始化一个数组
int[] dx={0,1,0,-1};//x的改变量
int[] dy={1,0,-1,0};//y的改变量
int x=0,y=0,d=0;
for(int i=1;i<=(n*m);i++){
int nx=x+dx[d],ny=y+dy[d];//初始化坐标(0,0)
if(nx<0||nx>=n||ny<0||ny>=m||st[nx][ny]){//判断是否撞墙和改位置是否已经存在数字
d=(d+1)%4;//四种方向的选择
nx=x+dx[d];
ny=y+dy[d];//移动之后的坐标
}
arr[x][y]=i;
st[x][y]=true;//标记改位置已被占用
x=nx;
y=ny;//移动后的坐标值,赋给x和y
}
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
System.out.print(arr[i][j]+" ");//打印排好序的数组
}
System.out.println();
}
}
}