其他分享
首页 > 其他分享> > [枚举] aw3785. 战舰(枚举+前缀和+经典好题+CF965B)

[枚举] aw3785. 战舰(枚举+前缀和+经典好题+CF965B)

作者:互联网

文章目录

1. 题目来源

链接:3785. 战舰

2. 题目解析

暴力题确实暴力方法做就行了。 O ( n 2 ) O(n^2) O(n2) 的话可以 递推+前缀和预处理 出来每个点四个方向上的可达长度,要注意,算上该点本身最长的长度是 k

思路:


时间复杂度: O ( n 3 ) O(n^3) O(n3)

空间复杂度: O ( n 2 ) O(n^2) O(n2)


#include <bits/stdc++.h>

using namespace std;

const int N = 105;

int n, k;
char g[N][N];

int main() {
    cin >> n >> k;
    for (int i = 1; i <= n; i ++ ) cin >> g[i] + 1;
    
    int cnt = 0, x = 1, y = 1;              // 不满足,输出任意位置均可
    for (int i = 1; i <= n; i ++ ) 
        for (int j = 1; j <= n; j ++ ) {
            if (g[i][j] == '#') continue;
            int l = j, r = j;               // 计算水平方向到达什么位置
            while (l >= 1 && g[i][l] == '.' && j - l + 1 <= k) l -- ;
            while (r <= n && g[i][r] == '.' && r - j + 1 <= k) r ++ ;
            int t = max(0, r - l - 1 - k + 1);      // 方案数,r,l最终停留位置为非法位置
            l = r = i;
            while (l >= 1 && g[l][j] == '.' && i - l + 1 <= k) l -- ;
            while (r <= n && g[r][j] == '.' && r - i + 1 <= k) r ++ ;
            t += max(0, r - l - 1 - k + 1);
            if (t > cnt) cnt = t, x = i, y = j;
        }
    
    cout << x << ' ' << y << endl;
    
    return 0;
}

标签:方案,cnt,int,好题,aw3785,枚举,该点,&&
来源: https://blog.csdn.net/yl_puyu/article/details/119282598