看到一个小伙伴分享这么一个东西,觉得蛮好玩的。先上图。我觉得蛮好玩的,就心心念念想着分享给你们也玩玩,顺便自己实现了一遍。
好,现在开始说是怎么玩的。
首先我观察到的一个科学的知识。我们假设为 size 为 N 的我们叫做 N 阶螺旋矩阵。如果 N = 1。直接输出就行了。如果 N 为偶数,那么最大值在左下角。如果 N 为奇数,那么最大值在右上角。
那么怎么去形成这样一个圈圈呢?可好玩了。
我们先在初始化的位置放一个小蕉,最大值 Math.pow(N,2) 。然后给它定义这么一些简单的一个指令,然后放小蕉自己去跑就行了。
如果N为偶数,那么第一步向右走。
如果N为奇数,那么第一步向左走。
向右走的时候如果撞到边界或其他数字了,向上走。否则继续向右走。
向上走的时候如果撞到边界或其他数字了,向左走。否则继续向上走。
向左走的时候如果撞到边界或其他数字了,向下走。否则继续向左走。
向下走的时候如果撞到边界或其他数字了,向右走。否则继续向下走。
每次走的时候都把当前的位置填上。
详细代码在这,常打小玩具手不生。
自己拿去玩玩吧~掰掰。欢迎交流。
import org.junit.Test; import utils.Printer; /** * Created by callmedj on 17/11/14. */ public class Scroll { @Test public void print(){ for(int i = 1 ; i < 10 ;i++){ scroll(i); Printer.println(""); } } public void scroll(int num){ int size = num; int initX,initY; int currentNum = (int)Math.pow(size,2) ; int maxLength = String.valueOf(currentNum).length(); Integer[][] target = new Integer[size][size]; Position current = new Position(); if(size == 1){ target[0][0] = 1; Printer.printArray(target,maxLength); return; } else if(size % 2 ==0){ initX = size-1; initY = 0; current.setX(initX).setY(initY); current.setDirection(Direction.RIGHT); }else{ initX = 0; initY = size-1; current.setX(initX).setY(initY); current.setDirection(Direction.LEFT); } target[current.getX()][current.getY()] = currentNum--; for(int i = 1 ; i < Math.pow(size,2);i++){ current = move(target,current,currentNum--); // Printer.printArray(target); } Printer.printArray(target,maxLength); } private Position move(Integer[][] target , Position currentPosition,int num){ int row = target.length; int column = target[0].length; int nextX = 0,nextY = 0; Direction direction = currentPosition.getDirection(); Position next = new Position(); switch (direction){ case LEFT: if(currentPosition.getY()-1 >= 0 && target[currentPosition.getX()][currentPosition.getY()-1] == null){ nextX = currentPosition.getX(); nextY = currentPosition.getY()-1; next.setDirection(Direction.LEFT); }else{ nextX = currentPosition.getX()+1; nextY = currentPosition.getY(); next.setDirection(Direction.DOWN); } break; case RIGHT: if(currentPosition.getY()+1 <= column - 1 && target[currentPosition.getX()][currentPosition.getY()+1] == null){ nextX = currentPosition.getX(); nextY = currentPosition.getY()+1; next.setDirection(Direction.RIGHT); }else{ nextX = currentPosition.getX()-1; nextY = currentPosition.getY(); next.setDirection(Direction.UP); } break; case UP: if(currentPosition.getX()-1 >= 0 && target[currentPosition.getX()-1][currentPosition.getY()] == null){ nextX = currentPosition.getX()-1; nextY = currentPosition.getY(); next.setDirection(Direction.UP); }else{ nextX = currentPosition.getX(); nextY = currentPosition.getY()-1; next.setDirection(Direction.LEFT); } break; case DOWN: if(currentPosition.getX()+1 <= row-1 && target[currentPosition.getX()+1][currentPosition.getY()] == null){ nextX = currentPosition.getX()+1; nextY = currentPosition.getY(); next.setDirection(Direction.DOWN); }else{ nextX = currentPosition.getX(); nextY = currentPosition.getY()+1; next.setDirection(Direction.RIGHT); } break; } next.setX(nextX).setY(nextY); target[nextX][nextY] = num; return next; } private enum Direction{ LEFT,RIGHT,UP,DOWN } private class Position{ private int x; private int y; private Direction direction; Position(){} Position(int x,int y){ this.x = x; this.y = y; } public int getX() { return x; } public Position setX(int x) { this.x = x; return this; } public int getY() { return y; } public Position setY(int y) { this.y = y; return this; } public Direction getDirection() { return direction; } public Position setDirection(Direction direction) { this.direction = direction; return this; } } }
public class Printer<V> { public static void println(Object object){ System.out.println(object); } public static void print(Object object){ System.out.print(object); } public void printList(List<V> objectList){ for(V object : objectList){ println(object); } } public static void printArray(Object[][] target,int maxLength){ if(target == null || target.length==0){ return; } int row = target.length; int column = target[0].length; for(int i = 0 ; i < row;i++){ for(int j=0;j<column;j++){ String current = target[i][j]+""; int needToAddZero = maxLength - current.length(); for(int k = 0 ; k < needToAddZero ; k++){ print(0); } print(current+" "); } println(""); } } }
点击查看更多内容
为 TA 点赞
评论
共同学习,写下你的评论
评论加载中...
作者其他优质文章
正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦