#include<iostream>
using namespace std;
//简单的dfs
//给定一切切割,求封闭区间个数
//对于每一割,用2的指数来表示,重叠则累加 这表示的是状态,之后用类似种子天填充的方法统计即可
int w,h,n;
__int64 num[61];
__int64 map[25][25];
__int64 temp,c;
int s[25][25];
int x1,y1,x2,y2;
int dx[4]={1,0,-1,0};
int dy[4]={0,-1,0,1};
bool check(int x,int y)
{
if(x>=0&&x<w&&y>=0&&y<h)return 1;
return 0;
}
void dfs(int x,int y)
{
if(check(x,y)==0)return ;
if(s[x][y])return ;
if(map[x][y]!=temp)return ;
s[x][y]=1;
int i,xx,yy,k;
for(i=0;i<4;i++)
{
xx=x+dx[i];
yy=y+dy[i];
dfs(xx,yy);
}
}
int main()
{
int i,j,k,t;
num[0]=1;
for(i=1;i<=60;i++)
{
num[i]=num[i-1]*2;
}
while(scanf("%d%d",&w,&h)!=EOF)
{
if(w==0&&h==0)break;
for(i=0;i<=w;i++)
{
for(j=0;j<=h;j++)
{
map[i][j]=0;
s[i][j]=0;
}
}
c=0;
scanf("%d",&n);
for(k=0;k<n;k++)
{
scanf("%d%d%d%d",&y1,&x1,&y2,&x2);
if(x1>x2){t=x1;x1=x2;x2=t;}
if(y1>y2){t=y1;y1=y2;y2=t;}
for(i=x1;i<x2;i++)
{
for(j=y1;j<y2;j++)
{
map[i][j]+=num[k];
}
}
}
for(i=0;i<w;i++)
{
for(j=0;j<h;j++)
{
if(s[i][j]==0)
{
temp=map[i][j];
dfs(i,j);
c++;
}
}
}
printf("%I64d\n",c);
}
return 0;
}
poj 3338 dfs
最新推荐文章于 2017-04-03 20:03:56 发布