POJ 1856

题意:给出一个r*c的矩形,问有多少不相交的矩形。矩形:‘#’组成,且必须是实心。相交:有边、或者点相邻。

题解:对于每一个含'#'且未被访问过的点进行一次dfs,并标记此次dfs所能到的最小最大x,y和总共访问了多少个点(ret),如果Δx*Δy=ret,则答案加1,否则,就是错误的。

View Code
 1 #include<cstdio>

 2 #include<cstring>

 3 #include<algorithm>

 4 using namespace std;

 5 int maxx,maxy,minx,miny,r,c;

 6 char map[1200][1200];

 7 bool check(int x,int y)

 8 {

 9     return x>=0&&y>=0&&x<r&&y<c&&map[x][y]=='#';

10 }

11 int dfs(int x,int y)

12 {

13     minx=min(minx,x);

14     miny=min(miny,y);

15     maxx=max(maxx,x);

16     maxy=max(maxy,y);

17     map[x][y]='.';

18     int ret=1;

19     for(int i=-1;i<=1;i++)

20         for(int j=-1;j<=1;j++)

21             if(check(x+i,y+j))

22                 ret+=dfs(x+i,y+j);

23     return ret;

24 }

25 int main()

26 {

27     while(scanf("%d%d",&r,&c),(r||c))

28     {

29         for(int i=0;i<r;i++)

30             scanf(" %s",map[i]);

31         int ans=0;

32         for(int i=0;i<r;i++)

33         {

34             for(int j=0;j<c;j++)

35             {

36                 if(map[i][j]=='#')

37                 {

38                     minx=maxx=i;

39                     miny=maxy=j;

40                     int ret=dfs(i,j);

41                     if(ret==(maxx-minx+1)*(maxy-miny+1))

42                         ans++;

43                     else

44                     {

45                         ans=-1;

46                         i=r;

47                         break;

48                     }

49                 }

50             }

51         }

52         if(ans==-1)

53             printf("Bad placement.\n");

54         else

55             printf("There are %d ships.\n",ans);

56     }

57     return 0;

58 }

你可能感兴趣的:(poj)