蛇形填数

本文介绍了一种在n*n矩阵中按蛇形路径填充数字1到n*n的方法,并提供了两种Java实现方案,一种采用复杂的边界控制逻辑,另一种则利用简单的递进逻辑实现。
题目描述
在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]+" ");
			}
		 } 
      }
   }
    
}  
反思:主要是注意数组下标越界和把握变化规律

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值