문제 링크: https://www.acmicpc.net/problem/14503

 

그냥 써있는대로 풀면 됩니다.

#pragma GCC optimize ("Ofast")
#define _CRT_SECURE_NO_WARNINGS
#define _SILENCE_CXX17_C_HEADER_DEPRECATION_WARNING

#include <bits/stdc++.h>
using namespace std;



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

int wall[50][50];
bool cleaned[50][50];

int main()
{
#ifndef ONLINE_JUDGE
	freopen("input.txt", "r", stdin);
	//freopen("output.txt", "w", stdout);
#endif

	ios_base::sync_with_stdio(false);
	cin.tie(nullptr), cout.tie(nullptr);
	
	int n, m, r, c, d;
	cin >> n >> m >> r >> c >> d;

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


	// robot
	int counter = 0;
	int y=r, x=c;
	bool end = false;
	while (!end) {
		if (!cleaned[y][x]) {
			cleaned[y][x] = 1;
			++counter;
		}

		while (!end) {
			bool all_clean = true;
			for (int i = 0; i < 4; ++i) {
				if (!wall[y + dy[i]][x + dx[i]] && !cleaned[y+dy[i]][x+dx[i]]) {
					all_clean = false;
					break;
				}
			}

			// 네 칸 모두 벽 or 청소됨
			if (all_clean) {
				int back_d = (d + 2) % 4;

				// 후진 x
				if (wall[y + dy[back_d]][x + dx[back_d]]) {
					end = true;
					break;
				}

				y += dy[back_d], x += dx[back_d];
				continue;
			}

			int left_d = (d + 3) % 4;	// 왼쪽 방향
			if (wall[y + dy[left_d]][x + dx[left_d]] || cleaned[y + dy[left_d]][x + dx[left_d]]) {
				d = left_d;
				continue;
			}

			y += dy[left_d], x += dx[left_d];
			d = left_d;
			break;
		}
	}
	cout << counter << '\n';

	return 0;
}

중간에 continue 한개 빼먹어서 삽질을 좀 했네요

반응형