持续创作,加速成长!这是我参与「掘金日新计划 · 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;
}