描述
在nn方陈里填入1,2,…,nn,要求填成蛇形。例如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
这是很笨的办法,感觉在凑答案,很麻烦
分析
x,y从几到几 x y
第一回合
下 0~n-1 n-1
左 n-1 n-2~0
上 n-2~0 0
右 0 1~n-2
第二回合
下 0~n-2 n-2
左 n-2 n-2~1
上 n-2~1 1
右 1 2~n-3
其中p,q就是按照这个规律变化的值
package practice;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
int[][] a=new int[n][n];//初始化数组,全0
int p=0;
int q=1;
int t=1;
for (int k = 1; k <= 2*n-1; k++) {
if(k%4==1) {//下
for (int i = p; i <= n-1-p; i++) {
a[i][n-1-p]=t++;
}
}else if(k%4==2) {//左
for (int i = n-1-q; i >= p; i--) {
a[n-1-p][i]=t++;
}
}else if(k%4==3) {//上
for (int i = n-1-q; i >= p; i--) {
a[i][p]=t++;
}
}else if(k%4==0) {//右
for (int i = q; i <= n-1-q; i++) {
a[p][i]=t++;
}
p++;q++;
}
}
//打印数组
for (int i = 0; i < a.length; i++) {
for (int j = 0; j < a[0].length; j++) {
System.out.print(a[i][j]+" ");
}
System.out.println();
}
}
}
这是简洁的代码
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
int[][] a=new int[n][n];//初始数组全为0
int x=0;//x,y最开始定位右上角
int y=n-1;
int t=1;//记录数字,从1开始递增
a[0][n-1]=t;//右上角为1
while(t<n*n) {//当t自增到n*n时就退出
//填数的规则是下,左,上,右四轮
//每走一轮就要走到底
//以“下”为例,当x+1不超过n,并且下一个数为0(表示没有被填过),就可以往里面填写数字,否则不满足条件
while(x+1<n && a[x+1][y]==0)a[++x][y]=++t;
while(y-1>=0 && a[x][y-1]==0)a[x][--y]=++t;
while(x-1>=0 && a[x-1][y]==0)a[--x][y]=++t;
while(y+1<n && a[x][y+1]==0)a[x][++y]=++t;
}
//打印出数组
for (int i = 0; i < a.length; i++) {
for (int j = 0; j < a[0].length; j++) {
System.out.print(a[i][j]+" ");
}
System.out.println();
}
}
}