题意:给出一个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 }