题目描述
给定一个 N∗M 的矩阵,求问里面有多少个由'#'组成的矩形,"There are 5 ships.",若是里面有一个不是矩形的联通块,则输出"So Sad"
输入格式
1≤n,m≤1000
有多组数据,EOF结束。
输出格式
每行对应一个answer
输入样例
6 8
.....#.#
##.....#
##.....#
.......#
#......#
#..#...#
6 8
.....#.#
##.....#
###...##
.......#
##.....#
#..#...#
输出样例
There are 5 ships.
So Sad
没错,解题思路就是从第一个‘#’号开始,对它上下左右开始查找是否存在‘子#’,然后再在子#号中找到下一层‘#’。最后统计这片连通域的‘#’是否为最大包围矩形的方格个数,若相等,则计入船数,若不等,则直接sad。另提:0船也是输出 0 ships;
另附偶同学代码
#include #include #include #include #include #include #include using namespace std; int t, n, m; int dp[1005][1005]; char s[2][1005]; int judge() { int ret=0; for(int i=1; i<=n; i++){ for(int j=1; j<=m; j++){ if(dp[i][j]){ int tmp=j; int ans=dp[i][j], ans2=dp[i+1][j]; while(j<=m){ if(dp[i][j]!=0&&dp[i][j]!=ans) return -1; if(dp[i][j]!=0&&dp[i+1][j]!=ans2) return -1; j++; if(!dp[i][j]) break; } j--; if(!dp[i+1][j]) ret++; } } //puts("good"); } return ret; } int main() { while(~scanf("%d%d",&n,&m)){ int ans=-1, mm=0; memset(dp,0,sizeof dp); for(int i=1; i<=n; i++){ scanf("%s",s[mm]); mm^=1; for(int j=1; j<=m; j++){ if(i!=1&&s[mm][j-1]=='#') dp[i][j]=(s[mm^1][j-1]=='#'?(dp[i-1][j]+1):0); else dp[i][j]=s[mm^1][j-1]=='#'?1:0; } } //for(int i=1; i<=n; i++) for(int j=1; j<=m; j++) printf("%d%c",dp[i][j],j==m?'\n':' '); ans=judge(); if(ans==-1) puts("So Sad"); else printf("There are %d ships.\n",ans); } return 0; }