思路:
定义一个flag标志方向,flag==1表示向右,flag==2表示向下,flag==3表示向左,flag==4表示向上。
稀里糊涂就做出来了,主打一个暴力枚举。
package 数组;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
public class P5731 {
public static void main(String[] args) throws NumberFormatException, IOException {
// TODO Auto-generated method stub
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));
int n = Integer.parseInt(br.readLine());
int num = 0, i = 0, j = 0, flag = 1;
int arr[][] = new int[n][n];
while(num < n*n) {
switch(flag++) {
case 1: //右
for(; j < n-i; j++) { //j < n-i是根据样例推出来的
arr[i][j] = ++num;
}
i++;
j--;
break;
case 2: //下
for(; i<=j; i++) { //i<=j是根据样例推出来的
arr[i][j] = ++num;
}
i--;
j--;
break;
case 3: //左
for(; j >= n-i-1; j--) { //j >= n-i-1是根据样例推出来的
arr[i][j] = ++num;
}
i--;
j++;
break;
case 4: //上
for(; i >= j+1; i--) { //每次结束都是在这个方向上结束
//最后一个num的坐标一定是[j+1,j]
arr[i][j] = ++num;
}
i++;
j++;
flag = 0;
break;
}
}
for(int ii = 0; ii < n; ii++) {
for(int jj = 0; jj < n; jj++)
out.printf("%3d",arr[ii][jj]);
out.println();
}
out.flush();
}
}
补充:
之前做的一道题,double类型强制转换为int会自动向下取整,如果遇到double类型的整数部分做下标,就直接强制转换为int型就可以,不需要使用Math.floor()方法。