pku3338

矩形切割,将矩形中的每块和坐标同等化,即在二维数组中偶数坐标对应的网格为原来矩形中的边线,这样根据切割,把切割的边标记出来,然后广搜,就可得出最后切割出了多少块.之所以这样实现,就是因为在切割中不同区域的标记问题不易处理,那么干脆就处理边框好了.

Source:

#include<iostream>

#include<queue>

using namespace std;

 

void search(int x,int y);

 

struct Node

{

    int x,y;

};

 

int cake[50][50],w,h;

 

int main()

{

    int i,j,t,x1,x2,y1,y2,sx,bx,sy,by,k;

    while(1)

    {

       cin>>w>>h;

       if(w==0 && h==0)break;

       w*=2;

       h*=2;

       memset(cake,0,50*50*sizeof(int));

       for(i=0;i<=w;++i)

       {

           cake[0][i]=1;

           cake[h][i]=1;

       }

       for(i=0;i<=h;++i)

       {

           cake[i][0]=1;

           cake[i][w]=1;

       }

//     for(i=0;i<=h;++i)

//     {

//         for(j=0;j<=w;++j)cout<<cake[i][j]<<" ";

//         cout<<endl;

//     }

//     cout<<"----------------------"<<endl;

       cin>>t;

       for(;t>0;--t)

       {

           cin>>x1>>y1>>x2>>y2;

           if(x1>x2)

           {

              sx=2*x2;

              bx=2*x1;

           }else

           {

              sx=2*x1;

              bx=2*x2;

           }

           if(y1>y2)

           {

              sy=2*y2;

              by=2*y1;

           }else

           {

              sy=2*y1;

              by=2*y2;

           }

          

           for(i=sx;i<=bx;++i)

           {

              cake[i][sy]=1;

              cake[i][by]=1;

           }

           for(i=sy;i<=by;++i)

           {

              cake[sx][i]=1;

              cake[bx][i]=1;

           }

       }

//     for(i=0;i<=h;++i)

//     {

//         for(j=0;j<=w;++j)cout<<cake[i][j]<<" ";

//         cout<<endl;

//     }

       for(i=1,k=0;i<h;++i)

       {

           for(j=1;j<w;++j)

           {

              if(cake[i][j]==0)

              {

                  k++;

                  search(i,j);

              }

           }

       }

       cout<<k<<endl;

    }

    return 0;

}

 

void search(int x,int y)

{

    int pos[4][2]={{0,1},{-1,0},{0,-1},{1,0}};

    int i,tx,ty;

    queue<Node> q;

    Node *p,c;

    p=new Node();

    p->x=x;

    p->y=y;

    q.push(*p);

    while(!q.empty())

    {

       c=q.front();

       q.pop();

       for(i=0;i<4;++i)

       {

           tx=c.x+pos[i][0];

           ty=c.y+pos[i][1];

           if(tx>=1 && tx<h && ty>=1 && ty<w && cake[tx][ty]==0)

           {

              p=new Node();

              p->x=tx;

              p->y=ty;

              q.push(*p);

              cake[tx][ty]=-1;

           }

       }

    }

}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值