수정된 코드
#include <iostream>
#define MAX 51
#define y first
#define x second
using namespace std;
struct Robot
{
int y, x, d;
Robot() = default;
Robot(int y, int x, int d = 0) : y(y), x(x), d(d)
{
}
} robot;
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL), cout.tie(NULL);
int h, w; cin >> h >> w;
cin >> robot.y >> robot.x >> robot.d;
auto& y = robot.y, & x = robot.x, & d = robot.d;
if (d == 1)
d = 3;
else if (d == 3)
d = 1;
int arr[MAX][MAX];
for (int i = 0; i < h; i++)
for (int j = 0; j < w; j++)
cin >> arr[i][j];
int ans = 0;
bool visited[MAX][MAX] = {};
pair<int, int> dir[]
{
{ -1,0 },
{ 0,-1 },
{ 1,0 },
{ 0,1 },
};
while (true)
{
if (!visited[y][x])
ans++;
visited[y][x] = true;
bool check = false;
for (int i = 1; i <= 4; i++)
{
int nd = (d + i) % 4, ny = y + dir[nd].y, nx = x + dir[nd].x;
if (visited[ny][nx] ||
arr[ny][nx] == 1)
continue;
check = true;
robot = { ny,nx,nd };
break;
}
if (!check)
{
int nd = (d + 2) % 4, ny = y + dir[nd].y, nx = x + dir[nd].x;
if (arr[ny][nx] == 0)
robot = { ny,nx, d };
else break;
}
}
cout << ans;
}
아래는 개인 코드
#include <iostream>
#include <algorithm>
#include <utility>
#include <queue>
using namespace std;
using IntPair = pair<int, int>;
vector<vector<int>> map;
IntPair dir[]
{
{ 0, 1 }, // 동
{ 0,-1 }, // 서
{-1, 0 }, // 남
{ 1, 0 } // 북
};
const int kTotalDir = 4;
int h, w, res = 0;
#define y first
#define x second
#define GetY(idx) dir[idx].y
#define GetX(idx) dir[idx].x
struct Robot
{
int y, x, d;
Robot() = default;
Robot(int y, int x, int d = 0) : y(y), x(x), d(d)
{
}
} robot;
queue<Robot> q;
bool CanTraverse(int y, int x) { return !(y < 0 || y >= h || x < 0 || x >= w); }
void BFS()
{
// 첫 탐색 여부
q.push(robot);
auto y = robot.y, x = robot.x;
// 1. 현재 위치 청소
if (map[y][x] == 0)
{
map[y][x]++;
res++;
}
while (!q.empty())
{
bool flag = false;
auto front = q.front(); q.pop();
for (int i = 0; i < kTotalDir; i++)
{
// 공식
// 2(동) : 4 % 4 = 0
// 0(서) : 2 % 4 = 1
// 3(남) : 5 % 4 = 2
// 1(북) : 3 % 4 = 3
auto bd = (i + front.d) % 4;
auto ny = front.y + GetY(bd), nx = front.x + GetX(bd);
cout << front.y << " " << front.x << endl;
if (CanTraverse(ny, nx))
{
// 왼쪽으로 탐색
if (map[ny][nx] == 0)
{
map[ny][nx]++;
res++;
q.push({ ny, nx });
flag = true;
break;
}
}
}
if(flag)
{
auto d = (front.d + 1) % 4;
auto ny = y + GetY(d), nx = x + GetX(d);
if (CanTraverse(ny,nx))
{
if (map[ny][nx] == 0)
q.push({ ny, nx });
}
}
}
cout << res;
}
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0), cout.tie(0);
// 지도 크기 결정
cin >> h >> w;
// 위치 설정
cin >> robot.y >> robot.x >> robot.d;
// 지도 정의
map.resize(h);
for (int i = 0; i < h; i++)
{
map[i].resize(w);
for (int j = 0; j < w; j++)
cin >> map[i][j];
}
BFS();
return 0;
}
'코딩테스트 > 백준' 카테고리의 다른 글
[골4] 15683 - 감시 (0) | 2022.08.30 |
---|---|
[골5] 9663 - N-Queen (0) | 2022.08.30 |
[실3] 1966 - 프린터 큐 (0) | 2022.08.27 |
[실3] 1021 - 회전하는 큐 (0) | 2022.08.26 |
[골5] 2023 - 신기한 소수 (0) | 2022.08.26 |