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