好好玩的螺旋演算法No.69
看到一個小夥伴分享這麼一個東西,覺得蠻好玩的。先上圖。我覺得蠻好玩的,就心心念念想著分享給你們也玩玩,順便自己實現了一遍。
好,現在開始說是怎麼玩的。
首先我觀察到的一個科學的知識。我們假設為 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(""); } }}
推薦閱讀:
TAG:演算法 |