平板涂色
題目描述
CE數(shù)碼公司開發(fā)了一種名為自動(dòng)涂色機(jī)(APM)的產(chǎn)品。它能用預(yù)定的顏色給一塊由不同尺寸且互不覆蓋的矩形構(gòu)成的平板涂色。
為了涂色,APM需要使用一組刷子。每個(gè)刷子涂一種不同的顏色C。APM拿起一把有顏色C的刷子,并給所有顏色為C且符合下面限制的矩形涂色:
為了避免顏料滲漏使顏色混合,一個(gè)矩形只能在所有緊靠它上方的矩形涂色后,才能涂色。例如圖中矩形F必須在C和D涂色后才能涂色。注意,每一個(gè)矩形必須立刻涂滿,不能只涂一部分。
寫一個(gè)程序求一個(gè)使APM拿起刷子次數(shù)最少的涂色方案。注意,如果一把刷子被拿起超過一次,則每一次都必須記入總數(shù)中。
輸入輸出格式
輸入格式:
第一行為矩形的個(gè)數(shù)N。下面有N行描述了N個(gè)矩形。每個(gè)矩形有5個(gè)整數(shù)描述,左上角的y坐標(biāo)和x坐標(biāo),右下角的y坐標(biāo)和x坐標(biāo),以及預(yù)定顏色。
顏色號(hào)為1到20的整數(shù)。
平板的左上角坐標(biāo)總是(0, 0)。
坐標(biāo)的范圍是0..99。
N小于16。?
輸出格式:
文件中記錄拿起刷子的最少次數(shù)。
輸入輸出樣例
輸入樣例#1:?
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
輸出樣例#1:?
3 其實(shí)這道題就是一道妥妥的深搜,但還有一群大佬用DP,誒(其實(shí)我不打DP是因?yàn)?#xff0c;我根本就不會(huì)⊙﹏⊙),我們發(fā)現(xiàn)這道題有一個(gè)坑,如果上面沒有涂,就要先涂上面的。
代碼: #include<bits/stdc++.h> using namespace std; struct str {int a1,a2,b1,b2,color; }a[111000]; int b1[11000]={0};//有沒有涂 int b[110][110],n,m,ans=999; int b2[11000];//顏色數(shù)量 int cmp(str x,str y)//排序 {if(x.a1!=y.a1) return x.a1<y.a1;//在排橫列 return x.a2<y.a2;//先排縱列 } bool cha(int x) {for(int i=0;i<n;i++){if(b[x][i]&&!b1[i]) return false;//上面沒涂,反回false}return true;//反回true } void dfs(int x,int ji_lu,int sum) {if(x>=ans)//如果當(dāng)前的值大于你要找的值,那就不用找了呢!O(∩_∩)O~~ {return ;}if(sum==n)//涂完了{(lán)ans=x;return ;}for(int i=0;i<m;i++)//枚舉每一種顏色 {int h=0;if(b2[i]&&i!=ji_lu)//可以涂,有顏色涂,沒有被涂過 {for(int j=0;j<n;j++){//cha函數(shù)判斷上面有沒有被涂(顏色) if(!b1[j]&&a[j].color==i&&cha(j))//如果沒涂過,且能涂 {b1[j]=1;//記錄 h++;}else if(b1[j]&&a[j].color==i) b1[j]++;}if(h>0)//如果被涂了 {dfs(x+1,i,sum+h);//進(jìn)行下一步 }for(int j=n-1;j>=0;j--)//回溯,不能上色 {if(b1[j]==1&&a[j].color==i&&cha(j)){b1[j]=0;h--;}else if(b1[j]>1&&a[j].color==i){b1[j]--;}}}} } int main() {cin>>n;for(int i=0;i<n;i++){cin>>a[i].a1>>a[i].a2>>a[i].b1>>a[i].b2>>a[i].color;b2[a[i].color]++;//顏色的數(shù)量 }m=19;//從零開始 sort(a,a+n,cmp);//應(yīng)為蒟蒻不會(huì)拓?fù)渑判蛩韵扰乓幌?for(int i=1;i<n;i++){for(int j=i-1;j>=0;j--){if(a[i].a1==a[j].b1&&((a[i].a2>=a[j].a2&&a[i].a2<=a[j].b2)||(a[i].b2>=a[j].a2&&a[i].b2<=a[j].b2))){b[i][j]=1;//如果i塊的最上面,且緊鄰j塊最下面,并且兩磚橫坐標(biāo)有重疊部分,即i塊為j塊,緊鄰的那塊磚}}}dfs(0,0,0);cout<<ans; }
做完之后,我只想去出題人面前說一句話:午時(shí)已到。
轉(zhuǎn)載于:https://www.cnblogs.com/dai-jia-ye/p/9323687.html
總結(jié)
- 上一篇: 快照是什么?揭秘存储快照的实现
- 下一篇: 搭建基于Jenkins的CI服务器