蛇形填数

来源:互联网 发布:施温格 知乎 编辑:程序博客网 时间:2024/06/05 02:07
题目描述
在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();}elseSystem.out.print(a[i][j]+" ");} }       }   }    }  
反思:主要是注意数组下标越界和把握变化规律

原创粉丝点击