蛇形填数
在n*n的方阵里填成蛇形,例如:
1 2 3 4 516 17 18 19 6
15 24 25 20 7
14 23 22 21 8
13 12 11 10 9
原理:创建一个二维数组,将数组清零,用a[i][j]==0判断该位置是否已填数,用x,y记录下一个数的坐标,t记录填入的数字。
样例输入:
5
样例输出:
1 2 3 4 5
16 17 18 19 6
15 24 25 20 7
14 23 22 21 8
13 12 11 10 9
import java.util.Arrays;
import java.util.Scanner;
public class Main {
public static void main(String[] args){
Scanner scanner = new Scanner(System.in);
while(scanner.hasNext())
{
int n=scanner.nextInt();
int[][] a=new int[n][n];
for(int[] temp:a){
Arrays.fill(temp, 0);
}
int t=1,x=0,y=0;
a[0][0]=t;
while(t<n*n){
while(y+1<n&&(a[x][y+1]==0))
a[x][++y]=++t;
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;
}
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
System.out.print(a[i][j]+" ");
}
System.out.println();
}
}
scanner.close();
}
}
如果蛇形填数要求的形状是:
13 14 15 16 1
12 23 24 17 2
11 22 25 18 3
10 21 20 19 4
9 8 7 6 5
只需对以上代码稍作修改即可,原理相同。
import java.util.Arrays;
import java.util.Scanner;
public class Main {
public static void main(String[] args){
Scanner scanner = new Scanner(System.in);
while(scanner.hasNext())
{
int n=scanner.nextInt();
int[][] a=new int[n][n];
for(int[] temp:a){
Arrays.fill(temp, 0);
}
int t=1,x=0,y=n-1;
a[0][n-1]=t;
while(t<n*n){
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<n;i++){
for(int j=0;j<n;j++){
System.out.print(a[i][j]+" ");
}
System.out.println();
}
}
scanner.close();
}
}
螺旋填数
在n*n的方阵里螺旋填数,例如:
13 12 11 10 25
14 3 2 9 24
15 4 1 8 23
16 5 6 7 22
17 18 19 20 21
原理仍与蛇形填数一样,只不过t从大到小填而已。
样例输入:
6
样例输出:
21 20 19 18 17 36
22 7 6 5 16 35
23 8 1 4 15 34
24 9 2 3 14 33
25 10 11 12 13 32
26 27 28 29 30 31
import java.util.Arrays;
import java.util.Scanner;
public class Main {
public static void main(String[] args){
Scanner scanner = new Scanner(System.in);
while(scanner.hasNext())
{
int n=scanner.nextInt();
int[][] a=new int[n][n];
for(int[] temp:a){
Arrays.fill(temp, 0);
}
int t=n*n,x=0,y=n-1;
a[0][n-1]=t;
while(t>1){
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<n;i++){
for(int j=0;j<n;j++){
System.out.print(a[i][j]+" ");
}
System.out.println();
}
}
scanner.close();
}
}