作者:乃ah麟 | 来源:互联网 | 2023-02-01 16:38
时间限制 1000 ms
内存限制65536 KB
题目描述
给定一个
N∗M
的矩阵,求问里面有多少个由'#'组成的矩形,"There are 5 ships.",若是里面有一个不是矩形的联通块,则输出"So Sad"
输入格式
1≤n,m≤1000
有多组数据,EOF结束。
输入样例
6 8
.....#.#
##.....#
##.....#
.......#
#......#
#..#...#
6 8
.....#.#
##.....#
###...##
.......#
##.....#
#..#...#
输出样例
There are 5 ships.
So Sad
先扫一遍看有没有不联通的矩形,很简单,就是“缺角”的矩形
接下来,枚举#的点,看其上方和左边是不是.即可,这样的#的数量即为ans
#include
#include
#include
#define N 1005
using namespace std;
char a[N][N];
int n,m,ans;
int flag;
int judge(){
int i=2,j=2,p,q;
for(;i<=n;i++)
for(;j<=m;j++){
int tmp=0;
for(p=i-1;p<=i;p++)
for(q=j-1;q<=j;q++)
if(a[p][q]=='.')tmp++;
if(tmp==1) return 0;
}
return 1;
}
int main(){
int i,j;
while(~scanf("%d%d",&n,&m)){
for(i=1;i<=n;i++) scanf("%s",a[i]);
for(i=1;i<=n;i++)
for(j=m;j>=1;j--)
a[i][j]=a[i][j-1];
for(i=0;i<=max(m,n);i++) {a[0][i]='.';a[i][0]='.';}
if(!judge()) printf("So Sad\n");
else{
ans=0;
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
if(a[i][j]=='#' && a[i][j-1]=='.' && a[i-1][j]=='.') ans++;
printf("There are %d ships.\n",ans);
}
}
return 0;
}