문제 링크

  • 풀이

문제가 매우 길지만 차근차근 읽어 나가며 문제의 요구조건을 빠뜨리지 않도록 주의하며 문제를 풀어야 한다. 특히 변수의 더하거나 뺄 시점에 주의한다.

#define _CRT_SECURE_NO_WARNINGS

#include <iostream>
#include <vector>

using namespace std;

int N, K;
int rel[10][10], win[3];
int gh[20], mh[20], ghi, mhi;
int used[10];

int game(int p1, int p2)
{
    if (win[0] == K)
        return 1;
    
    if (win[1] == K || win[2] == K )
        return 0;

    int ret = 0;
    if (p1 == 1)
    {
        if (rel[gh[ghi]][mh[mhi]] == 2)
        {
            ghi++;
            mhi++;
            win[1] += 1;
            ret = game(0, 1);
            win[1] -= 1;
        }
        else
        {
            ghi++;
            mhi++;
            win[2] += 1;
            ret = game(0, 2);
            win[2] -= 1;
        }
        ghi--;
        mhi--;

        return ret;
    }

    for (int i = 1; i <= N; i++)
    {
        if (!used[i])
        {
            used[i] = 1;

            if (p2 == 1)
            {
                if (rel[i][gh[ghi]] == 2)
                {
                    ghi++;
                    win[0] += 1;
                    ret = game(0, 2);
                    win[0] -= 1;
                }
                else
                {
                    ghi++;
                    win[1] += 1;
                    ret = game(1, 2);
                    win[1] -= 1;
                }
                ghi--;
            }
            else
            {
                if (rel[i][mh[mhi]] == 2)
                {
                    mhi++;
                    win[0] += 1;
                    ret = game(0, 1);
                    win[0] -= 1;
                }
                else
                {
                    mhi++;
                    win[2] += 1;
                    ret = game(1, 2);
                    win[2] -= 1;
                }
                mhi--;
            }

            used[i] = 0;

            if (ret)
                return ret;
        }
    }
    return 0;
}

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);

    cin >> N >> K;
    for (int r = 1; r <= N; r++)
        for (int c = 1; c <= N; c++)
            cin >> rel[r][c];

    for (int i = 0; i < 20; i++)
        cin >> gh[i];
    for (int i = 0; i < 20; i++)
        cin >> mh[i];

    cout << game(0, 1) << "\n";
}

댓글남기기