#include <iostream>
using namespace std;
struct queqe {
int x;
int y;
}q[10000000], q2[100000000];
int main() {
int r, c;
cin >> r >> c;
char map[1010][1010] = { '.' };
int v[1010][1010] = { 0 };
for (int i = 0; i < r; i++) {
for (int j = 0; j < c; j++) {
cin >> map[i][j];
v[i][j] = 1;
}
}
int head2 = -1;
int head = -1;
q[0].x = 0;
q[0].y = 0;
head++;
int xx, yy, x, y;//x>r y>c
int xx2, yy2, x2, y2;
int dp[5][2] = { {1,0},{-1,0},{0,1},{0,-1} ,{0,0} };
int cnt = 0;
int flag = 0;
int cnt2 = 0;
for (int i = 0; i < r - 1; i++) {
if (flag == 1) {
break;
}
for (int j = 0; j < c - 1; j++) {
cnt2 = 0;
if (map[i][j] == '#') {
cnt2++;
}
if (map[i + 1][j] == '#') {
cnt2++;
}
if (map[i][j + 1] == '#') {
cnt2++;
}
if (map[i + 1][j + 1] == '#') {
cnt2++;
}
if (cnt2 == 3) {
flag = 1;
break;
}
}
}
while (head != -1 && flag == 0) {
x = q[head].x;
y = q[head].y;
head--;
for (int i = 0; i < 5; i++) {
xx = x + dp[i][0];
yy = y + dp[i][1];
if (xx >= 0 && xx < r && yy >= 0 && yy < c && v[xx][yy] == 1) {
v[xx][yy] = 0;
if (map[xx][yy] == '.') {
head++;
q[head].x = xx;
q[head].y = yy;
continue;
}
else {
head2 = 0;
cnt++;
q2[0].x = xx;
q2[0].y = yy;
while (head2 != -1) {
x2 = q2[head2].x;
y2 = q2[head2].y;
head2--;
for (int j = 0; j < 4; j++) {
xx2 = x2 + dp[j][0];
yy2 = y2 + dp[j][1];
if (xx2 >= 0 && xx2 < r && yy2 >= 0 && yy2 < c && v[xx2][yy2] == 1 && map[xx2][yy2] == '#') {
v[xx2][yy2] = 0;
head2++;
q2[head2].x = xx2;
q2[head2].y = yy2;
}
}
}
}
}
}
}
if (flag == 1) {
printf("Bad placement.");
}
else {
printf("There are %d ships.", cnt);
}
return 0;
}
代码有优化空间么