#include <bits/stdc++.h>
using namespace std;
char arr[1100][1100];
int pd[1100][1100];
int ans[1000];
int a,b,num = 1;
int fx[4][2] = {{0,1},{1,0},{-1,0},{0,-1}};
void dfs(int zx,int zy,int jishu){
for(int i = 0; i < 4; i++){
int nx = zx + fx[i][0];
int ny = zy + fx[i][1];
if(nx >= 0 && nx < a && ny >= 0 && ny < b && pd[nx][ny] == 0 && arr[nx][ny] == '#'){
pd[nx][ny] = jishu;
dfs(nx,ny,jishu);
}
}
}
int zsx,zsy,ysx,ysy,zxx,zxy,yxx,yxy;
void fzs(int nn){
for(int i = 0; i < a; i++){
for(int j = 0; j < b; j++){
if(pd[i][j] == nn){
zsx = i;
zsy = j;
return ;
}
}
}
}
void fys(int nn){
for(int i = 0; i < a; i++){
for(int j = b-1; j >= 0; j--){
if(pd[i][j] == nn){
ysx = i;
ysy = j;
return ;
}
}
}
}
void fzx(int nn){
for(int i = a-1; i >= 0; i--){
for(int j = 0; j < b; j++){
if(pd[i][j] == nn){
zxx = i;
zxy = j;
return ;
}
}
}
}
void fyx(int nn){
for(int i = a-1; i >= 0; i--){
for(int j = b-1; j >= 0; j--){
if(pd[i][j] == nn){
yxx = i;
yxy = j;
return ;
}
}
}
}
bool stapd(int nn){
///去找4个方位
fzs(nn);
fys(nn);
fzx(nn);
fyx(nn);
///四个点位是相互平行
if(zsx == ysx && zsy == zxy && yxy == ysy && zxx == yxx){
for(int i = zsx; i <= zxx; i++){
for(int j = zsy; j <= yxy; j++){
if(arr[i][j] != '#'){
return 0;
}
}
}
return 1;
}
}
int main(){
cin >> a >> b;
for(int i = 0; i < a; i++){
for(int j = 0; j < b; j++){
cin >> arr[i][j];
}
}
for(int i = 0; i < a; i++){
for(int j = 0; j < b; j++){
if(pd[i][j] == 0 && arr[i][j] == '#'){
pd[i][j] = num;
dfs(i,j,num);
num++;
}
}
}
///开始统计
for(int i = 0; i < a; i++){
for(int j = 0; j < b; j++){
if(pd[i][j] != 0){
ans[pd[i][j]]++;
}
}
}
for(int i = 1; i < num; i++){
if(ans[i] == 1){
continue;
}
if(!stapd(i)){
printf("Bad placement.");
return 0;
}
}
printf("There are %d ships.",num-1);
return 0;
}
题目要求没什么看懂,题目中就只说了方形才符合要求,没说几乘几的方形,所以判断方形那里弄得比较麻烦,略过略过