끄적끄적
SWE 달뱅이 숫자 본문
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