Free Lines Arrow
본문 바로가기
Algorithm/번외

[Algorithm] 벌집 만들기

by skahn1215 2021. 10. 5.
728x90
반응형

문제

  • 벌집 모양으로 순서대로 숫자를 채워 나간다.
  • size 에 따라서  크기가 결정된다.

 

 

분석

한바퀴 돌았으면 돌았다는 것을 확인하기 위해 rotate 플래그 사용

한바퀴 돌면 한 면에 둘수 있는 size 를 줄여야 한다.

 

 

 

구현

package algorithm.prim;

public class HoneyComb {
    private int [][]map;
    private int mapMaxX;
    private int mapMaxY;
    private int length;
    private boolean rotate = false;

    private int []dirX = {1, 2, 1, -1, -2, -1};
    private int []dirY = {1, 0, -1, -1, 0, 1};


    public void setLength(int length) {
        if (length > 3) {
            mapMaxX  = length *3+(length-3);
        } else {
            mapMaxX = length *3;
        }

        mapMaxY = length*2;
        this.length = length;
    }

    public boolean checkNextStep(int row, int col) {
        if (row >= mapMaxX || row < 0 || col >= mapMaxY || col < 0) {
            return false;
        } else {
            return true;
        }
    }

    public void solve(int x, int y,int cnt, int num, int dir) {

        map[x][y] = num;

        // 방향 전환
        if (cnt == length) {
            cnt = 1;
            dir = (dir + 1) % dirX.length;
        }

        // 대각선 방향 위로 진행 될때 이미 값이 있는 경우는
        // 대각선 아래 방향밖에 없다.
        if(dir == 5 && map[x+dirX[dir]][y+dirY[dir]] != 0) {
            cnt = 1;
            dir = (dir + 1) % dirX.length;
            rotate =true;
        }

        // 회전 했을 경우 아래로 진행될때
        // 최대 길이를 1 줄인다
        if (rotate && dir == 1) {
            length--;
            rotate = false;
        }


        if (checkNextStep(x+dirX[dir], y+dirY[dir])) {
            if (map[x+dirX[dir]][y+dirY[dir]] == 0) {
                solve(x+dirX[dir],  y+dirY[dir], cnt+1, num+1, dir);
            }
        }
    }

    public void solution() {
        map = new int[mapMaxX][mapMaxY];

        solve(0,mapMaxY/2,1,1,0);
    }

    public void printMap() {
        for(int i = 0; i < mapMaxX; i++) {
            for(int j = 0; j < mapMaxY; j++) {
                System.out.print(map[i][j]+" ");
            }
            System.out.println("");
        }
    }

    public static void main(String[] args) {
        HoneyComb honeyComb = new HoneyComb();
        try {

            honeyComb.setLength(3);
            honeyComb.solution();
            honeyComb.printMap();

        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
    }
}

 

 

728x90
반응형

'Algorithm > 번외' 카테고리의 다른 글

[Algorithm] version max 값 찾기  (0) 2023.01.23
[Algorithm] 뿌요뿌요(퍼즐게임)  (0) 2021.10.19

댓글