Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
我自己解决了,感觉真好^_^In Reply To:终于想通怎么做了可是为什么wa?大牛帮帮忙 Posted by:testjoan at 2006-03-25 19:58:30 > # include <iostream.h> > # include <stdlib.h> > # include <memory.h> > const int N=16; > > struct Rectangle{ > int r1,c1; > int r2,c2; > int color; > bool isPainted; > }; > > Rectangle rec[N];//describe the rectangles > > bool isImediateUp[N][N];//if isImediateUp[i][j]=true then i is imediately up on j > int recsUp[N]; > > int recnums; > int brushes;//the times of change brushes > int min;//the minimum times > > void paintrec(int c); > void Paintsearch(); > > void main(){ > int cases; > int i,j; > > cin>>cases; > while (cases--){ > //load in data > cin>>recnums; > for (i=0;i<recnums;i++){ > cin>>rec[i].r1>>rec[i].c1>>rec[i].r2>>rec[i].c2>>rec[i].color; > rec[i].isPainted=false; > } > > //initial sets > memset(recsUp,0,sizeof(int)); > memset(isImediateUp,0,sizeof(bool)); > > //describe the structure of the recs(especially the up-relation) > for (i=0;i<recnums;i++){ > for (j=0;j<recnums;j++){ > if (i==j) continue; > //1.the top ends the bottom//2.the left and right side both within the edge > if (rec[i].r2==rec[j].r1 && !(rec[i].c2<=rec[j].c1 || rec[i].c1>=rec[j].c2)){ > isImediateUp[i][j]=true;//i is immediately up on j > recsUp[j]++;//recs immediately upon j > } > } > } > //calculate the paint times > min=recnums; > brushes=0; > Paintsearch(); > cout<<min<<endl; > } > } > > > void Paintsearch(){ > int i,j,k; > bool isover=true; > bool temp_isPainted[N]; > bool temp_isImediateUp[N][N]; > int temp_recsUp[N]; > > for (i=0;i<recnums;i++){ > if (rec[i].isPainted==false) {isover=false;break;} > } > if (isover==true){//ending condition > if (brushes<min) min=brushes; > return; > } > > for (i=0;i<recnums;i++){//search which color can be painted now > if (rec[i].isPainted == true) continue; > if (recsUp[i] != 0) continue; > > for (j=0;j<recnums;j++) { > temp_isPainted[j]=rec[j].isPainted; > temp_recsUp[j]=recsUp[j]; > for (k=0;k<recnums;k++) temp_isImediateUp[j][k]=isImediateUp[j][k]; > } > > paintrec(rec[i].color);//paint the color > brushes++; > > Paintsearch(); > > brushes--; > for (j=0;j<recnums;j++){ > rec[j].isPainted=temp_isPainted[j]; > recsUp[j]=temp_recsUp[j]; > for (k=0;k<recnums;k++) isImediateUp[j][k]=temp_isImediateUp[j][k]; > } > } > } > > > void paintrec(int c){//use brush with c color to paint all recs now that can be painted > int i,j; > for (i=0;i<recnums;i++){ > if (rec[i].color != c) continue; > if (recsUp[i] != 0) continue; > if (rec[i].isPainted==true) continue; > //paint the rec > rec[i].isPainted=true; > //substract the rectangles pressed by rec_i > for (j=0;j<recnums;j++){ > if (i==j) continue; > if (isImediateUp[i][j]==true){ > isImediateUp[i][j]=false; > recsUp[j]--; > } > } > } > } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator