#1,#5,#11三个点wa掉了,好像是bad place没有判断出来,求大犇来给孩子讲下吧 代码如下:
#include<bits/stdc++.h>
using namespace std;
//#define int long long
inline int read() {
int x = 0, f = 1;
char c = getchar();
while (c < '0' || c > '9') {
if (c == '-')f = -1;
c = getchar();
}
while (c >= '0' && c <= '9') {
x = x * 10 + c - '0';
c = getchar();
}
return x * f;
}
const int nextt[4][2] = {1, 0, 0, 1, -1, 0, 0, -1};
char mp[1005][1005];
int n, m;
void dfs(int x, int y) {
mp[x][y] = '.';//标记成.防止重复搜
for (int i = 0; i < 4; i++) {
int dx = x + nextt[i][0], dy = y + nextt[i][1];
if (mp[dx][dy] == '#' && dx >= 1 && dx <= n && dy >= 1 && dy <= m) {
dfs(dx, dy);
}
}
}
signed main() {
int ans = 0;
n = read(), m = read();
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
cin >> mp[i][j];
}
}
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
if (mp[i][j] == '.') {
int tmp = 0;
for (int k = 0; k < 4; k++) {
if (mp[i + nextt[k][0]][j + nextt[k][1]] == '#') {
tmp++;
}
}
if (tmp == 3) {
puts("Bad placement.");
exit(0);
}
}
}
}//判断是否相撞,估计是这儿有问题,少判了些什么
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
if (mp[i][j] == '#') {
ans++;
dfs(i, j);
}
}
}//dfs爆搜找有多少块
printf("There are %d ships.", ans);
return 0;
}