본문 바로가기

Programming/BOJ

[백준/C++] 14503번: 로봇청소기 (DFS/구현)

  

(**삼성 SW 기출문제)

 

조건들이 까다로워서 어려웠다... 내가 푼건 아니고 남이 푼거보면서 안보고 그대로 작성해봤다. 반시계방향으로 회전하면서 바라본다는 점을 생각해야하고 또 하나는 다 돌아본다음에 그 방향을 유지하고 후진해야한다는거.... 진짜 읽은 그대로 코딩해야된다. 너무어렵다.. 갈길이 멀구나 힘을내자.

 

#include<iostream>


using namespace std;

int n, m;
int map[51][51];

int dx[] = { -1, 0, 1, 0 };
int dy[] = { 0, 1, 0, -1 };

int ans;

void dfs(int cx, int cy, int cd) {
	if (map[cx][cy] == 0) {
		map[cx][cy] = 2;
		ans++;
	}

	for (int i = 0; i < 4; i++) {
		int nd = (cd + 3 - i) % 4;
		int nx = cx + dx[nd];
		int ny = cy + dy[nd];

		if (nx < 0 || ny < 0 || nx >= n || ny >= m) {
			continue;
		}

		if (map[nx][ny] == 0) {
			dfs(nx, ny, nd);
		}
	}    

	int nd = (cd + 2) % 4;
	int nx = cx + dx[nd];
	int ny = cy + dy[nd];

	if (map[nx][ny] == 1) {
		cout << ans;
		exit(0);
	}
	dfs(nx, ny, cd); //바라보는 방향을 유지한채.....
}


int main(void) {
	cin >> n >> m;

	int r, c, dir;
	cin >> r >> c >> dir;

	for (int i = 0; i < n; i++) {
		for (int j = 0; j < m; j++) {
			cin >> map[i][j];
		}
	}

	dfs(r, c, dir);

	return 0;
}