1 条题解

  • 0
    @ 2026-10-25 19:13:29

    思路

    只有紧靠上方且横向正长度交叠的矩形构成前置,选色后可连锁涂所有已就绪同色块,最少拿刷次数。

    参考程序(C++11)

    #include <bits/stdc++.h>
    using namespace std;
    int n,full;vector<array<int,5>>a;vector<int>need,order,memo,colors;int solve(int mask){if(mask==full)return 0;int &ans=memo[mask];if(ans>=0)return ans;ans=n;for(int c:colors){int next=mask;for(int i:order)if(!(next>>i&1)&&a[i][4]==c&&(need[i]&next)==need[i])next|=1<<i;if(next!=mask)ans=min(ans,1+solve(next));}return ans;}int main(){cin>>n;a.resize(n);for(auto &v:a)for(int &x:v)cin>>x;need.resize(n);for(int i=0;i<n;i++)for(int j=0;j<n;j++)if(a[j][2]==a[i][0]&&max(a[i][1],a[j][1])<min(a[i][3],a[j][3]))need[i]|=1<<j;for(int i=0;i<n;i++){order.push_back(i);colors.push_back(a[i][4]);}sort(order.begin(),order.end(),[](int i,int j){return a[i][0]<a[j][0];});sort(colors.begin(),colors.end());colors.erase(unique(colors.begin(),colors.end()),colors.end());full=(1<<n)-1;memo.assign(1<<n,-1);cout<<solve(0)<<'\n';}
    
    • 1

    信息

    ID
    1441
    时间
    1000ms
    内存
    64MiB
    难度
    普及+
    标签
    递交数
    1
    已通过
    1
    上传者