Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

我自己解决了,感觉真好^_^

Posted by testjoan at 2006-03-25 20:07:26 on Problem 1691
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:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator