洛谷P1331
学太多东西反而容易想得太多做不出来
检测是否合法只需先搜索出以当前位置向右向下连续'#'的长度和深度,
在以这两个参数为长宽的矩阵中搜索是否存在'.',
存在就不合法,不存在就看一下这个矩阵周边半径一格位置是否有'#'(即其他船)
有其他船就不合法,否则就将这艘合法船所占空间全部标上vis记号(vis数组对应元素设置为true)
返回true值
点击查看代码
#include<bits/stdc++.h>
using namespace std;
const int N = 1010;
vector<vector<char>>a(N, vector<char>(N, '.'));
bool vis[N][N];
int r, c;
bool dfs(int x, int y) {
int width = 0, height = 0;
while(y + width <= c && a[x][y + width] == '#') width++;
while(x + height <= r && a[x + height][y] == '#') height++;
for(int i = x; i < x + height; i++) {
for(int j = y; j < y + width; j++) {
if(i > r || j > c || a[i][j] == '.' || vis[i][j]) return 0;
}
}
for(int i = x - 1; i <= x + height; i++) {
for(int j = y - 1; j <= y + width; j++) {
if (i > 0 && i <= r && j > 0 && j <= c) {
if ((i < x || i >= x + height || j < y || j >= y + width) && a[i][j] == '#')
return false;
}
}
}
for(int i = x; i < x + height; i++) {
for(int j = y; j < y + width; j++) {
vis[i][j] = 1;
}
}
return 1;
}
int main() {
cin >> r >> c;
for(int i = 1; i <= r; i++) {
for(int j = 1; j <= c; j++) {
cin >> a[i][j];
}
}
int ans = 0;
for(int i = 1; i <= r; i++) {
for(int j = 1; j <= c; j++) {
if(a[i][j] == '#' && vis[i][j] == 0) {
if(!dfs(i, j)) {
cout << "Bad placement.\n";
return 0;
}
ans++;
}
}
}
cout << "There are " << ans << " ships.\n";
return 0;
}

浙公网安备 33010602011771号