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