안녕하세요. 오늘은 채점을 할 거예요.

문제

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

아이디어

한문제 한문제 차근차근 봅시다.
어떤 문제가 있으면 a+b=c의 꼴이 됩니다. 이때 c가 무엇인지부터 알아야 합니다. 그래서 to_int함수로 특정 위치부터 수를 쭉 찾아낼 겁니다.

이렇게 a,b,c를 구했으면 a+b가 c인지 확인하면 됩니다. 만약 정답이면 동그라미를 그려주면 됩니다. 이 동그라미의 모양은 c가 몇자리수인지에 따라서 달라집니다.

소스코드

#include <iostream>
#include <string>
using namespace std;

string s[222];

int to_int(int x, int y)
{
    int ans = 0;
    while ('0' <= s[x][y] && s[x][y] <= '9')
    {
        ans *= 10;
        ans += s[x][y] - '0';
        y++;
    }
    return ans;
}

void correct(int x, int y)
{
    int i;
    for (i = 1; i <= 5; i++)
    {
        s[x][y + i] = '*';
        s[x + 2][y + i] = '*';
    }
    s[x + 1][y] = '*';

    if (to_int(x + 1, y + 5) >= 10)
    {
        s[x][y + 6] = '*';
        s[x + 1][y + 7] = '*';
        s[x + 2][y + 6] = '*';
    }
    else
    {
        s[x + 1][y + 6] = '*';
    }
}
void wrong(int x, int y)
{
    s[x][y + 3] = s[x + 1][y + 2] = s[x + 2][y + 1] = '/';
}

int main()
{
    ios_base::sync_with_stdio(false); cin.tie(NULL);
    int N, M, i, j;

    cin >> N >> M;
    for (i = 0; i < 3 * N; i++) cin >> s[i];

    for (i = 0; i < 3 * N; i += 3)
    {
        for (j = 0; j < 8 * M; j += 8)
        {
            int a = to_int(i + 1, j + 1), b = to_int(i + 1, j + 3), c = to_int(i + 1, j + 5);
            if (a + b == c) correct(i, j);
            else wrong(i, j);
        }
    }

    for (i = 0; i < 3 * N; i++)
        cout << s[i] << "\n";
}


감사합니다.

0개의 댓글