zoukankan      html  css  js  c++  java
  • pku3338

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

    #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;
    }

                    
  • 相关阅读:
    最近公共祖先
    洛谷 P1076 寻宝 解题报告
    洛谷 P1121 环状最大两段子段和 解题报告
    洛谷 P3705 [SDOI2017]新生舞会 解题报告
    洛谷 P1381 单词背诵 解题报告
    洛谷 P3155 [CQOI2009]叶子的染色 解题报告
    洛谷 P3237 [HNOI2014]米特运输 解题报告
    洛谷 P2345 奶牛集会 解题报告
    洛谷 P1582 倒水 解题报告
    数论知识荟萃
  • 原文地址:https://www.cnblogs.com/SQL/p/913919.html
Copyright © 2011-2022 走看看