책 118p 참고.
단순 구현 문제지만 좌표를 다루기 때문에 인덱스 검사, 좌표 위치 검사 등등이 필요했다.
import java.util.*;
public class Main {
public static void main(String args[]) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt(); //맵 행 크기
int m = sc.nextInt(); //맵 열 크기
int my_x = sc.nextInt(); //출발 행 위치
int my_y = sc.nextInt(); //출발 열 위치
int d = sc.nextInt(); //바라보는 방향
int[][] map = new int[n][m]; //맵 생성
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
map[i][j] = sc.nextInt(); //바다 or 육지 정보 받기
}
}
boolean flag = true; //갈 수 있는 방향이 있는지 확인 값
int answer = 0; //방문한 칸의 수
int[] dx = {-1, 0, 1, 0}; //행 이동(북, 동, 남, 서)
int[] dy = {0, 1, 0, -1}; //열 이동(북, 동, 남, 서)
while(flag){
int i;
map[my_x][my_y] = 1; //현 위치 방문 표시
answer++; //방문 수 카운트
for(i=1;i<=4;i++){
int nd = (d-i)>0?(d-i):(d-i+4); //현 방향에서 왼쪽으로 볼 것.
int nx = my_x+dx[nd]; //바라본 방향의 좌표 찾기
int ny = my_y+dy[nd]; //바라본 방향의 좌표 찾기
//방문 가능하면(방문하지 않은 육지)
if(!(nx < 0 || nx > n-1 || ny < 0 || ny > m-1)){
if(map[nx][ny] ==0){
my_x = nx;
my_y = ny; //현 위치 변경
System.out.println("위치 바뀜 "+nx+" "+ny);
break;
}
//현재 바라본 방향이 이동 불가라면
else{
continue; //다음 i로 넘어감
}
}
}
//갈 수 있는 방향이 없다면
if(i>4){
flag = false; //while을 빠져나갈 변수 값
}
}
System.out.println(answer);
}
}