坐标系转换一下 求联通子图个数 内存时间都比较小

 

#include<string.h>
#include
<stdio.h>

int w, d, n, cnt;
bool e[21][21][2];//0 right || 1 up
bool v[21][21];
int x1, y1, x2, y2;

bool link(int i1, int j1, int i2, int j2)
{
    
if(i2==i1-1)
        
return e[i1][j1][0];
    
if(j2==j1-1)
        
return e[i1][j1][1];
    
if(i2==i1+1)
        
return e[i2][j2][0];
    
if(j2==j1+1)
        
return e[i2][j2][1];
}


void DFS(int i, int j)
{
    v[i][j]
=1;
    
if(i-1>=0 && v[i-1][j]==0 && !link(i,j,i-1,j))
        DFS(i
-1,j);

    
if(j-1>=0 && v[i][j-1]==0 && !link(i,j,i,j-1))
        DFS(i,j
-1);

    
if(i+1<&& v[i+1][j]==0 && !link(i,j,i+1,j))
        DFS(i
+1,j);

    
if(j+1<&& v[i][j+1]==0 && !link(i,j,i,j+1))
        DFS(i,j
+1);
}



void draw()
{
    
int i;
    
if((x1<x2 && y1<y2) || (x1>x2 && y1>y2))
    
{
        
if(x1>x2 && y1>y2)
        
{
            
int x,    y;
            x
=x1,    y=y1;
            x1
=x2,    y1=y2;
            x2
=x,    y2=y;
        }

        
for(i=x1;i<x2;i++)
        
{
            e[i][y1][
1]=e[i][y2][1]=1;
        }

        
for(i=y1;i<y2;i++)
        
{
            e[x1][i][
0]=e[x2][i][0]=1;
        }

    }


    
if((x1>x2 && y1<y2) || (x1<x2 && y1>y2))
    
{
        
if(x1>x2 && y1<y2)
        
{
            
int x,    y;
            x
=x1,    y=y1;
            x1
=x2,    y1=y2;
            x2
=x,    y2=y;
        }

        
for(i=x1;i<x2;i++)
        
{
            e[i][y1][
1]=e[i][y2][1]=1;
        }

        
for(i=y2;i<y1;i++)
        
{
            e[x1][i][
0]=e[x2][i][0]=1;
        }

    }

}

 
int main()
{

    
    
while(scanf("%d%d",&w,&d)==2)
    
{
        
if(w==0 && d==0)break;
        cnt
=0;
        scanf(
"%d",&n);
        memset(e,
0,sizeof(e));
        memset(v,
0,sizeof(v));
        
int i, j;
        
for(i=0;i<n;i++)
        
{
            scanf(
"%d%d%d%d",&y1,&x1,&y2,&x2);
            draw();
        }


        
for(i=0;i<w;i++)
            
for(j=0;j<d;j++)
            
{
                
if(!v[i][j])
                
{
                    cnt
++;
                    DFS(i,j);
                }

            }


        printf(
"%d\n",cnt);

    }



    

    
return 0;
}