洛谷P1331

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;
}
posted @ 2025-05-19 02:31  Chuan81  阅读(11)  评论(0)    收藏  举报