안녕하세요. 오늘은 청소를 할 거예요.

문제

https://www.acmicpc.net/problem/31404

아이디어

구현 자체는 쉽습니다.
그러면 언제까지 반복해야할까요? 똑같은곳을 여러번 방문해도 그 다음 경로에 바뀔수 있기 때문에 어렵습니다.
정해는 먼지를 치울때마다 visit배열을 초기화하고 visit배열에서 방문한적 있는 곳을 다시 방문하면 멈추는 것입니다.
하지만 저는 그냥 한 장소에 1만번 이상 방문하면 break하도록 했습니다.

소스코드

#include <iostream>
#include <algorithm>
#define ll long long
using namespace std;

int main(void)
{
    ios_base::sync_with_stdio(false); cin.tie(NULL);
    ll H, W, R, C, D, A[111][111] = { 0 }, B[111][111] = { 0 }, cnt = 0, i, j, ans = 0;
    ll dx[4] = { -1,0,1,0 }, dy[4] = { 0,1,0,-1 };
    ll map[111][111] = { 0 }; //0:먼지있음, 1:먼지없음
    ll ck[111][111][4] = { 0 };

    cin >> H >> W >> R >> C >> D;
    for (i = 0; i < H; i++)
    {
        for (j = 0; j < W; j++)
        {
            char c;
            cin >> c;
            A[i][j] = c - '0';
        }
    }
    for (i = 0; i < H; i++)
    {
        for (j = 0; j < W; j++)
        {
            char c;
            cin >> c;
            B[i][j] = c - '0';
        }
    }

    while (true)
    {
        cnt++;
        if (ck[R][C][D] == 10000) break;
        ck[R][C][D]++;
        if (map[R][C] == 0)
        {
            D += A[R][C]; D %= 4;
            map[R][C] = 1;
            R += dx[D]; C += dy[D];
            ans = max(ans, cnt);
        }
        else
        {
            D += B[R][C]; D %= 4;
            R += dx[D]; C += dy[D];
        }
        if (R < 0 || C < 0 || R >= H || C >= W)
        {
            break;
        }
    }
    cout << ans;
}


감사합니다.

0개의 댓글