蛇形填数

问题描述:

在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≤8。

算法实现:

 1 package com.ysw.test;
 2 
 3 import java.util.Scanner;
 4 
 5 /*
 6  * 问题描述:
 7  * 在n*n方阵里填入1,2,„,n*n,要求填成蛇形。例如n=4时方阵为: 
 8 
 9  10    11   12   1 
10 
11  9    16   13   2 
12 
13  8    15   14   3
14 
15  7     6     5    4  
16 
17  上面的方阵中,多余的空格只是为了便于观察规律,不必严格输出。n≤8。
18 
19  */
20 
21 public class snakeFilled {
22 
23     /**
24      * @param args
25      */
26     public static void main(String[] args) {
27 
28         int n;
29         // 定义坐标,随着坐标的变化不断填数,起点坐标为(x=0,y=n-1)
30         // 移动的方向:下->下->..->左->左-..>上->上-..>右...
31         int x, y;
32         Scanner reader = new Scanner(System.in);
33         n = reader.nextInt();
34         int myArray[][] = new int[n][n];
35 
36         // 先填第一个空格,数字为1
37         // 填写的数字ptNum:1->n*n
38         int ptNum = myArray[x = 0][y = n - 1] = 1;
39         // 先判断再移动
40         while (ptNum < n * n) {
41             // 当向下移动时,不出现出界或者格子已经填充过数位置
42             // 判断是否可以下移
43             while (x + 1 < n && (myArray[x + 1][y] == 0)) {
44                 // 向下填充++ptNum
45                 myArray[++x][y] = ++ptNum;
46             }
47             // 当向上移动时,不出现出界或者格子已经填充过数位置
48             // 判断是否可以上移
49             while (x - 1 >= 0 && (myArray[x - 1][y] == 0)) {
50                 // 向上填充++ptNum
51                 myArray[--x][y] = ++ptNum;
52             }
53             // 当向左移动时,不出现出界或者格子已经填充过数位置
54             // 判断是否可以左移
55             while (y - 1 >= 0 && (myArray[x][y - 1] == 0)) {
56                 // 向左填充++ptNum
57                 myArray[x][--y] = ++ptNum;
58             }
59             // 当向右移动时,不出现出界或者格子已经填充过数位置
60             // 判断是否可以右移
61             while (y + 1 < n && (myArray[x][y + 1] == 0)) {
62                 // 向右填充++ptNum
63                 myArray[x][++y] = ++ptNum;
64             }
65         }
66         // 格式化打印
67         for (x = 0; x < n; x++) {
68             for (y = 0; y < n; y++) {
69                 System.out.print(myArray[x][y] + "  ");
70             }
71             System.out.println();
72         }
73     }
74 
75 }

测试输入:5

输出:

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  
原文地址:https://www.cnblogs.com/ysw-go/p/5869854.html