POJ 3338 Rectangle Cutting

問題

hxwの長方形のケーキに対して、n個の長方形の切れ目を入れる。
それぞれの切れ目はx1,y1,x2,y2によって指定される。


全ての切れ目を入れ終えた後、ケーキはいくつの部分に分割されているか求めよ。

制約条件

h,w≦20
n≦50
座標およびh,wは全て整数

方針

線分を全てboolの配列に入れて、塗りつぶしのdfsする。

ソースコード

const int dy[]={-1,0,1,0},dx[]={0,-1,0,1};
int h,w,n;
bool tate[21][21],yoko[21][21];
bool v[21][21];
void dfs(int y,int x){
	v[y][x]=1;
	rep(d,4){
		int ny=y+dy[d],nx=x+dx[d];
		if(ny<0||nx<0||ny>=h||nx>=w||v[ny][nx])continue;
		if(d==0&&yoko[y][x]||d==1&&tate[y][x]||d==2&&yoko[y+1][x]||d==3&&tate[y][x+1])continue;
		dfs(ny,nx);
	}
}
int main(){
	while(scanf("%d%d",&h,&w),h){
		scanf("%d",&n);
		memset(tate,0,sizeof(tate));
		memset(yoko,0,sizeof(yoko));
		memset(v,0,sizeof(v));
		
		rep(i,n){
			int x1,y1,x2,y2;
			scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
			if(x1>x2)swap(x1,x2);
			if(y1>y2)swap(y1,y2);
			
			for(int x=x1;x<x2;x++)yoko[y1][x]=yoko[y2][x]=1;
			for(int y=y1;y<y2;y++)tate[y][x1]=tate[y][x2]=1;
		}
		int ans=0;
		rep(i,h)rep(j,w)if(!v[i][j])dfs(i,j),ans++;
		printf("%d\n",ans);
	}
	return 0;
}