Rectangle Cutting

Time Limit: 1.0 Seconds    Memory Limit: 65536K

In the small historical village of Basinia, there is a popular activity in wedding ceremonies called rectangle cutting. During this activity, each close relative of the bride comes and cuts a rectangle in the wedding cake (but does not take a piece). The cake has a rectangular shape. The problem is to count how many pieces are in the cake after rectangle-cutting.

For example, in the following figure, the cake size is 3×5, and three people have made rectangular cuts in it. As a result, the cake is cut into six pieces.

pku 3338 Rectangle Cutting 侥幸过的,还是有些难度的_第1张图片

Each rectangular cut is specified by the (x, y) coordinates of its two opposite corners. The input for the above figure can be found in the first sample input. As there are large families in Basinia, the number of pieces may be large and we need a computer program to compute it.

Input

The input contains several test cases. Each test has several lines. The first line has two integers w (1 ≤ w ≤ 20) and h (1 ≤ h ≤ 20) which are the width and height of the cake. The second line contains a single integer n (0 ≤ n ≤ 50) which is the number of people who cut rectangles in the cake. After this, there are n lines each containing the integers x1, y1, x2, y2 which are the coordinates of two opposite corners of the cut. You may assume 0 ≤ x1, x2w and 0 ≤ y1, y2h. The last line of the input is a line containing two zeros.

Output

For each test case, write the number of pieces the cake is cut into.

Sample Input

3 5
3
1 1 3 2
4 0 2 3
4 0 5 1
6 6
2
2 0 5 3
3 1 4 2
0 0

Sample Output

6
3
题目大意:
    给定一个w*h的矩形,在这个矩形里切小矩形,最后计算并输出封闭图形的个数
思路:
   把矩形看作w*h个小方块,第n次切割,就在所切的矩形的方块上标记数字2^n,如果重复切到同一个方块就把
标记值累加,这样标记完后再深搜,就得到封闭图形个数了。(标记为2^n,是ht同学的思想,很巧妙,但只能使用
于数据量比较小的情况)。同时此题应注意w 和 h 的顺序,我在这里耽误了好久,还wa了一次。
代码:

     
    
    
    
Source Code

Problem: 
3338   User: wic 
Memory: 272K  Time: 0MS 
Language: C
++   Result: Accepted 

Source Code 
#include
< iostream >
using   namespace  std;
int  a[ 25 ][ 25 ];
int  mark =- 1 ,k;
int   w,h;
int  dir[ 4 ][ 2 ] = {{-1,0},{1,0},{0,-1},{0,1}} ;
int  power( int  a,  int  b) // pow的返回值类型不是int,于是自己写了一个函数
{
    
int ans=1;
    
while(b--)
        ans
*=a;
return ans;

}

bool  inside( int  x,  int  y)
{
    
if(x<=&& x>0 && y<=&& y>0)
        
return true;
    
else
        
return false;
}


void  dfs( int  x,  int  y) // 自己写的深搜,嘿嘿
{
    
for(int i=0; i<4; i++){
        
int xx=x+dir[i][0];
        
int yy=y+dir[i][1];
        
if(inside(xx,yy) && a[yy][xx]!=mark && a[yy][xx]==k){
            a[yy][xx]
=mark;
            dfs(xx,yy);
        }

    }

}

int  main()
{
    
int i,j,n,x1,y1,x2,y2,maxx,maxy,minx,miny,m;
    
while(cin>>w>>&& w && h){
        memset(a, 
0sizeof(a));
        cin
>>n;
        k
=0;
        
int c=0;
        
int count=0;
        
while(n--){
            cin
>>x1>>y1>>x2>>y2;
            maxx
=(x1>=x2)?x1:x2;
            minx
=(x1<=x2)?x1:x2;
            maxy
=(y1>=y2)?y1:y2;
            miny
=(y1<=y2)?y1:y2;
            m
=power(2,c);
        
            
for(i=miny+1; i<=maxy; i++)
                
for(j=minx+1; j<=maxx; j++)
                    a[i][j]
+=m;
    
    
        c
++;
        }

        k
=c;
        m
=power(2,k);
        
for(k=0; k<m; k++){
            
for(i=1; i<=w;  i++)
                
for(j=1; j<=h; j++)
                    
if(a[i][j]!=mark&&a[i][j]==k)
                    
{    dfs(j,i); count++;}
                    
        }

        cout
<<count<<endl;
    }



return 0;
}