https://www.acmicpc.net/problem/14503
이전에 C++로 풀었던 문제이다. JAVA로 다시 풀어 보았다.
C++로 풀었을 때는 bool f변수를 사용해서 종료 조건을 확인하였고, JAVA에서는 System.exit(0)을 사용해서 바로 종료하도록 하였다.
[JAVA]
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
public static int N,M;
public static int rx,ry,rd;
public static int ans=0;
public static int[][] map;
//public static int[][] visit;
public static int[] dx= {-1,0,1,0};
public static int[] dy= {0,1,0,-1};
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
N=Integer.parseInt(st.nextToken());
M=Integer.parseInt(st.nextToken());
st = new StringTokenizer(br.readLine(), " ");
rx=Integer.parseInt(st.nextToken());
ry=Integer.parseInt(st.nextToken());
rd=Integer.parseInt(st.nextToken());
map=new int[N][M];
for(int i=0; i<N; i++) {
st = new StringTokenizer(br.readLine(), " ");
for(int j=0; j<M; j++) {
map[i][j]=Integer.parseInt(st.nextToken());
}
}
map[rx][ry]=2;
ans++;
solve(rx,ry,rd);
}
private static void solve(int x, int y, int d) {
int dir=d;
for(int i=0; i<4; i++) {
dir = (dir+3)%4;
int nx = x+dx[dir];
int ny = y+dy[dir];
if(map[nx][ny]!=0) continue;
map[nx][ny]=2;
ans++;
solve(nx,ny,dir);
break;
}
if(d==0 || d==2) {
dir=2-d;
}else {
dir=4-d;
}
int nx = x+dx[dir];
int ny = y+dy[dir];
if(map[nx][ny]==1) {
System.out.println(ans);
System.exit(0);
}
solve(nx,ny,d);
}
}
[C++]
#include <iostream>
using namespace std;
int N, M;
int map[50][50];
int cnt=0;
bool visited[50][50] = { 0 };
//0북 1동 2남 3서 (d+3)%4
int dx[4] = { -1,0,1,0 };
int dy[4] = { 0,1,0,-1 };
void Start(int x, int y, int d) {
int nx, ny, nd=d;
bool f = 0;
for (int i = 0; i < 4; i++) {
nd = (nd + 3) % 4;
nx = x + dx[nd];
ny = y + dy[nd];
if (!visited[nx][ny] && map[nx][ny] == 0) {
visited[nx][ny] = true;
cnt++;
f = 1;
Start(nx, ny, nd);
break;
}
}
if (f == 0) {
if (d < 2) {
nd = d + 2;
}
else if (d >= 2) {
nd = d - 2;
}
nx = x + dx[nd];
ny = y + dy[nd];
if (map[nx][ny] == 0) {
Start(nx, ny, d);
}
else if(map[nx][ny] == 1){
return;
}
}
}
int main() {
int r, c, d;
cin >> N >> M;
cin >> r >> c >> d;
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
cin >> map[i][j];
}
}
visited[r][c] = true;
cnt++;
Start(r, c, d);
cout << cnt;
return 0;
}
'알고리즘 문제풀이 > 백준' 카테고리의 다른 글
[백준 2174] 로봇 시뮬레이션(JAVA) (2) | 2020.03.04 |
---|---|
[백준 1966] 프린터 큐(JAVA) (0) | 2020.03.04 |
[백준 2023] 신기한 소수(JAVA) (0) | 2020.03.03 |
[백준 1764] 듣보잡(JAVA) (0) | 2020.03.03 |
[백준 1389] 케빈 베이컨의 6단계 법칙(JAVA) (0) | 2020.03.01 |
댓글