战舰

43 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第29天,点击查看活动详情

题目信息描述

给定一个 n×nn×n 的字符矩阵,表示一片海域。

矩阵中 # 表示暗礁区域,. 表示安全区域。

现在要将一个 1×k1×k 的战舰投放到海域中。

投放时,战舰不可接触到暗礁区域。

战舰可以横着投放,也可以竖着投放。

在投放完成后,每个安全区域要么包含战舰的一部分,要么不包含。

对于某个安全区域,如果所有可能的投放方式中,共有 mm 种不同的投放方式,满足该区域包含战舰的一部分,那么就称该区域的投放指数为 mm。

请确定投放指数最大的安全区域的位置坐标。

输入格式

第一行包含两个整数 nn 和 kk。

接下来 nn 行,每行包含一个长度为 nn 的字符串,表示海域。

输出格式

输出投放指数最大的安全区域的行、列坐标。

行从上到下,从 11 开始计数,列从左到右,从 11 开始计数。

如果答案不唯一,输出任意合理方案均可。

如果海域中根本无法投放战舰,则输出任意区域均可。

数据范围

1≤k≤n≤1001≤k≤n≤100

输入样例1:

4 3
#..#
#.#.
....
.###

输出样例1:

3 2

输入样例2:

10 4
#....##...
.#...#....
..#..#..#.
...#.#....
.#..##.#..
.....#...#
...#.##...
.#...#.#..
.....#..#.
...#.#...#

输出样例2:

6 1

输入样例3:

19 6
##..............###
#......#####.....##
.....#########.....
....###########....
...#############...
..###############..
.#################.
.#################.
.#################.
.#################.
#####....##....####
####............###
####............###
#####...####...####
.#####..####..#####
...###........###..
....###########....
.........##........
#.................#

输出样例3:

1 8

思路

暴力枚举

重点是,数据范围:1≤k≤n≤100。所以这道题可以直接使用暴力算法。 枚举每一个非障碍的点,并且往其下和右方向分别延伸k-1格,像一个┏,成功则为该延伸上每个格点添加一优先级。由于数据范围太小,基本上不需要剪枝或优化操作

注意:时间复杂度为O(n^2)

代码

#include <iostream>
#include <cstring>
using namespace std;
int n,k;
bool a[101][101];
int ans[101][101];
int rem=0,remx=1,remy=1;
bool lin(int x,int y){
    if(x>=n||y>=n){
        return true;
    }else if(a[x][y]==false){
        return true;
    }else if(a[x][y]==true){
        return false;
    }
}
int main(){
    cin >> n >> k;
    memset(ans,0,sizeof(ans));
    for(int i=0;i<n;i++){
        for(int j=0;j<n;j++){
            char ch;
            cin >> ch;
            if(ch == '#'){
                a[i][j]=false;
            }else if(ch == '.'){
                a[i][j]=true;
            }
        }
    }
    for(int i=0;i<n;i++){
        for(int j=0;j<n;j++){
            if(a[i][j]){
                bool h=true,s=true;
                for(int l=1;l<k;l++){
                    if(lin(i,j+l)) h=false;
                }
                for(int l=1;l<k;l++){
                    if(lin(i+l,j)) s=false;
                }
                if(h){
                    for(int l=0;l<k;l++){
                        ans[i][j+l]++;
                    }
                }
                if(s){
                    for(int l=0;l<k;l++){
                        ans[i+l][j]++;
                    }
                }
            }
        }
    }
    for(int i=0;i<n;i++){
        for(int j=0;j<n;j++){
            if(ans[i][j]>rem){
                rem=ans[i][j];
                remx=j+1;
                remy=i+1;
            }
        }
    }
    cout << remy << " " <<remx;
    return 0;
}
​