题目
输入两个整数 n 和 m,输出一个 n行 m列的矩阵,将数字 11 到 n×m 按照回字蛇形填充至矩阵中。
具体矩阵形式可参考样例。
输入格式
输入共一行,包含两个整数 n 和 m。
输出格式
输出满足要求的矩阵。
矩阵占 n 行,每行包含 m 个空格隔开的整数。
数据范围
1≤n,m≤100
样例
输入样例:
3 3
输出样例:
1 2 3
8 9 4
7 6 5
题目思路
该题目较为简单,只要将数字按照它要求的方式进行填入即可,则可以转化为在数组中进行填写数字,填写规则:先向右,当不能在向右填数字时,在向下填数字,当不能在向下填数字时,之后在向左填写数字,当不能在向左填数字时,在向上填写数字,当不能在向上填数字时,在向右填写数字……,如此不断循环,直到数字值k=a*b截至。如图所示,题目大致思路
源代码
import java.util.Scanner;
public class Main{
private static final int N = 110;
//在这里一次定义:向右、向下、向左、向上
private static final int[] dx={0,1,0,-1};
private static final int[] dy={1,0,-1,0};
private static int[][] g=new int[N][N];
public static void main(String[] args){
Scanner sc=new Scanner(System.in);
int a=sc.nextInt(),b=sc.nextInt();
int x=0,y=0,k=1,t=0;
while(true){
g[x][y]=k;
if(k==a*b) break;
int tx=x+dx[t],ty=y+dy[t];
if(tx>=0 && tx<a && ty>=0 && ty<b && g[tx][ty]==0){
//当前可以沿着该方向继续前进
x=tx;
y=ty;
k++;
}else{
//该进行改变方向
t++;
//当t>=4的时候应该从新从向左开始
t%=4;
}
}
//打印数组
for(int i=0;i<a;i++){
for(int j=0;j<b;j++){
System.out.print(g[i][j]+" ");
}
System.out.println();
}
}
}