题目描述
在n*n方阵里填入1,2,...,n*n,要求填成蛇形。例如n=4时方阵为:
10 11 12 1
9 16 13 2
8 15 14 3
7 6 5 4
输入
直接输入方阵的维数,即n的值。(n<=100)
输出
输出结果是蛇形方阵。
样例输入
3
样例输出
7 8 1
6 9 2
在n*n方阵里填入1,2,...,n*n,要求填成蛇形。例如n=4时方阵为:
10 11 12 1
9 16 13 2
8 15 14 3
7 6 5 4
输入
直接输入方阵的维数,即n的值。(n<=100)
输出
输出结果是蛇形方阵。
样例输入
3
样例输出
7 8 1
6 9 2
5 4 3
复杂方法:
package MainTest;
import java.util.*;
public class Main {
private static void snakeSquare(int n) {
int[][] square = new int[n][n];
// true 代表递增, false代表递减
boolean flag = true;
// ture代表垂直方向变化, false代表水平方向变化
boolean dir = true;
// R,r是上下边界值;C,c是左右边界值
int R = n-1, C = n-1, r = 0, c = 0;
for(int i = n-1, j = 0,counter = 0 ; counter < n*n;counter++){
square[j][i] = counter + 1;
// 垂直往下
if(dir && flag) {
j+=1;
if(j == C) {dir = !dir;flag = !flag;}
}
//垂直向上
else if(dir && !flag) {
j -= 1;
if(j == c) {dir = !dir;flag = !flag;}
}
//水平向右
else if(!dir && flag) {
i += 1;
if(i == R-1) {
dir = !dir;
//水平向右结束后说明要进入下一个内环,要改变边界范围
C -= 1;R -= 1;r += 1;c += 1;
}
}
//水平向左
else {
i -= 1;
if(i == r)
dir = !dir;
}
}
for(int i = 0 ; i < n; i++){
for(int j = 0; j < n;j++)
System.out.print(square[i][j] + " ");
System.out.println();
}
}
public static void main(String[] args) {
Scanner in= new Scanner(System.in);
while(in.hasNext()){
int k=in.nextInt();
snakeSquare(k);}
}
}
改进简单方法:package MainTest;
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner in= new Scanner(System.in);
while(in.hasNext()){
int k=in.nextInt();
int[][] a=new int[k][k];
for (int i = 0; i <k; i++) {
for (int j = 0; j <k; j++) {
a[i][j]=0;
}
}
int count=1;
int x=0,y=k-1;
a[x][y]=1;
while(count<(k*k)){
while(x+1<k&&(a[x+1][y]==0)) a[++x][y]=++count;
while(y-1>=0&&(a[x][y-1]==0)) a[x][--y]=++count;
while(x-1>=0&&(a[x-1][y]==0)) a[--x][y]=++count;
while(y+1<k&&(a[x][y+1]==0)) a[x][++y]=++count;
}
for (int i = 0; i <k; i++) {
for (int j = 0; j <k; j++) {
if(j==k-1){
System.out.print(a[i][j]);
System.out.println();}
else
System.out.print(a[i][j]+" ");
}
}
}
}
}
反思:主要是注意数组下标越界和把握变化规律