Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

끄적끄적

SWE 달뱅이 숫자 본문

알고리즘

SWE 달뱅이 숫자

yenacathy97 2021. 8. 6. 21:07

boolean 배열로 방문 여부를 체크한다.

방문하였거나 인덱스를 벗어났으면 시계방향으로 방향을 회전한다.

package day0803;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Snail {
	static int [][]arr;
	public static void main(String[] args) throws  IOException {
		// TODO Auto-generated method stub

		BufferedReader bf= new BufferedReader(new InputStreamReader(System.in));
		int test=Integer.parseInt(bf.readLine());//test케이스 수
		for(int t=1;t<=test;t++) {
		int n=Integer.parseInt(bf.readLine());//입력받는 변수
		arr= new int[n+1][n+1]; // 출력할 배열
		boolean [][] visited=new boolean[n+1][n+1]; //방문 여부를 나타내는 배열
		
		makeCycle(n,1,1,1,1,visited);
		System.out.println("#"+t);
		for(int i=1;i<=n;i++) {
			for(int j=1;j<=n;j++) {
				System.out.print(arr[i][j] + " ");
			}System.out.println();
		}
		
		}
		
	}

	static void makeCycle(int n,int y,int x,int num,int direct,boolean[][] visited) {
		//n은 크기, y는 현재 좌표 y축, x는 현재 좌표 x축, num은 현재 출력할 숫자 , direct는 방향 , visited는 방문을 나타내는 배열
		if(num==n*n+1) return; //n*n을 출력한 이후이므로 종료
		visited[y][x]=true; //현재 위치 방문했음을 알림
		arr[y][x]=num; // 배열에 현재 num 삽입
		
		if(direct==1) { // -> 방향
			if(x<n&&!visited[y][x+1]) { //만약 배열 끝이 아니고 오른쪽을 방문하지 않았으면
				makeCycle(n,y,x+1,num+1,1,visited); //오른쪽 방향으로 나아감
			}
			else makeCycle(n,y+1,x,num+1,2,visited); //아니라면 아래 방향으로 나아감
		}
		else if(direct==2) { //아래 방향 
			if(y<n && !visited[y+1][x]) {
				makeCycle(n,y+1,x,num+1,2,visited);
			}
			else makeCycle(n,y,x-1,num+1,3,visited); //아니면 왼쪽으로 나아감 (<-)
		}
		else if(direct==3) { //<- 방향
			if(x>1 && !visited[y][x-1]) { 
				makeCycle(n,y,x-1,num+1,3,visited);
			}
			else makeCycle(n,y-1,x,num+1,4,visited); //위로 나아감
		}
		else if(direct==4) { //위로 나아감
			if(y>1 &&!visited[y-1][x]) {
				makeCycle(n,y-1,x,num+1,4,visited);
			}
			else makeCycle(n,y,x+1,num+1,1,visited); //오른쪽으로 나아감
		}
	}
	
}

'알고리즘' 카테고리의 다른 글

백준 1244 스위치 켜고끄기  (0) 2021.08.06
SWE 원재의 메모리 복구하기  (0) 2021.08.06
SWE Ladder1  (0) 2021.08.06
SWE Flatten  (0) 2021.08.06
SWE 상호의 배트필드  (0) 2021.08.06
Comments