WA #4#5#6 求助
查看原帖
WA #4#5#6 求助
679239
Lindone楼主2024/4/18 15:08

记录

#include <bits/stdc++.h>
using namespace std;
struct Matrix
{
    int x1, y1, x2, y2, Color;
};

Matrix A[18];

int N, Ans = 20;
int Constraint[18];
int Mat[100][100];
int F[1 << 16][21];

int main()
{
    cin >> N;
    for (int k = 0; k < N; ++k)
    {
        cin >> A[k].x1 >> A[k].y1 >> A[k].x2 >> A[k].y2 >> A[k].Color;
        for (int i = A[k].x1; i < A[k].x2; ++i)
        {
            for (int j = A[k].y1; j < A[k].y2; ++j)
            {
                Mat[i][j] = k;
            }
        }
    }
    for (int k = 0; k < N; ++k)
    {
        if (!A[k].x1)
        {
            continue;
        }
        for (int j = A[k].y1; j < A[k].y2; ++j)
        {
            Constraint[k] |= (1 << Mat[A[k].x1 - 1][j]);
        }
        Constraint[k] |= (1 << k);
    }
    memset(F, 127, sizeof(F));
    for (int i = 1; i <= 20; ++i)
    {
        F[0][i] = 1;
    }
    for (int i = 1; i < 1 << N; ++i)
    {
        for (int j = 0; j < N; ++j)
        {
            if ((Constraint[j] & i) != Constraint[j])
            {
                continue;
            }
            int& Crt = F[i][A[j].Color];
            Crt = F[i ^ (1 << j)][A[j].Color];
            for (int k = 1; k <= 20; ++k)
            {
                if (A[j].Color == k)
                {
                    continue;
                }
                Crt = min(Crt, F[i ^ (1 << j)][k] + 1);
            }
        }
    }
    for (int i = 1; i <= 20; ++i)
    {
        Ans = min(Ans, F[(1 << N) - 1][i]);
    }
    cout << Ans << endl;
    return 0;
}

2024/4/18 15:08
加载中...