日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

平板涂色(信息学奥赛一本通-T1445)

發布時間:2025/3/17 编程问答 12 豆豆
生活随笔 收集整理的這篇文章主要介紹了 平板涂色(信息学奥赛一本通-T1445) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

【題目描述】

CE數碼公司開發了一種名為自動涂色機(APM)的產品。它能用預定的顏色給一塊由不同尺寸且互不覆蓋的矩形構成的平板涂色。

為了涂色,APM需要使用一組刷子。每個刷子涂一種不同的顏色C。APM拿起一把有顏色C的刷子,并給所有顏色為C且符合下面限制的矩形涂色:

為了避免顏料滲漏使顏色混合,一個矩形只能在所有緊靠它上方的矩形涂色后,才能涂色。例如圖中矩形F必須在C和D涂色后才能涂色。注意,每一個矩形必須立刻涂滿,不能只涂一部分。

寫一個程序求一個使APM拿起刷子次數最少的涂色方案。注意,如果一把刷子被拿起超過一次,則每一次都必須記入總數中。

【輸入】

第一行為矩形的個數N。下面有N行描述了N個矩形。每個矩形有5個整數描述,左上角的y坐標和x坐標,右下角的y坐標和x坐標,以及預定顏色。

顏色號為1到20的整數。

平板的左上角坐標總是(0, 0)。

坐標的范圍是0..99。N小于16。

【輸出】

拿起刷子的最少次數。

【輸入樣例】

7?
0 0 2 2 1?
0 2 1 6 2?
2 0 4 2 1?
1 2 4 4 2?
1 4 3 6 1?
4 0 6 4 1?
3 4 6 6 2

【輸出樣例】

3

【源程序】

#include<iostream> #include<cstdio> #include<cstdlib> #include<string> #include<cstring> #include<cmath> #include<ctime> #include<algorithm> #include<utility> #include<stack> #include<queue> #include<vector> #include<set> #include<map> #include<bitset> #define EPS 1e-9 #define PI acos(-1.0) #define INF 0x3f3f3f3f #define LL long long #define Pair pair<int,int> const int MOD = 1E9+7; const int N = 1000000+5; const int dx[] = {-1,1,0,0,-1,-1,1,1}; const int dy[] = {0,0,-1,1,-1,1,-1,1}; using namespace std;struct Rectangle{int x1,y1,x2,y2;int color; }rect[20]; bool vis[20]; bool G[40][40]; int res=15; bool judge(int x) {if(rect[x].x1==0)return true;for(int i=rect[x].y1+1;i<=rect[x].y2;i++)if(G[rect[x].x1][i]==0)return false;return true; } void update(int x,int sta){for(int i=rect[x].x1+1;i<=rect[x].x2;i++)for(int j=rect[x].y1+1;j<=rect[x].y2;j++)G[i][j]=sta; } void dfs(int p,int k,int num,int n){//第p塊板子刷第k次,累積了num塊板子if(k>res)//可行性剪枝return;if(num==n)res=min(res,k);for(int i=1;i<=n;i++){if(!vis[i]&&judge(i)){update(i,1);vis[i]=true;num++;if(rect[i].color==rect[p].color)dfs(i,k,num,n);else{k++;dfs(i,k,num,n);k--;}update(i,0);vis[i]=false;num--;}} } int main() {int n;scanf("%d",&n);for(int i=1;i<=n;i++)scanf("%d%d%d%d%d",&rect[i].x1,&rect[i].y1,&rect[i].x2,&rect[i].y2,&rect[i].color);dfs(0,0,0,n);printf("%d\n",res);return 0; }

?

總結

以上是生活随笔為你收集整理的平板涂色(信息学奥赛一本通-T1445)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。