生活随笔
收集整理的這篇文章主要介紹了
3785. 战舰
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
3785. 戰艦
#include <bits/stdc++.h>
using namespace std
;int main() {int n
, k
;cin
>> n
>> k
;vector
<vector
<int>> a(n
+ 1, vector
<int>(n
+ 1));for(int i
= 1; i
<= n
; i
++) {for(int j
= 1; j
<= n
; j
++) {char c
;cin
>> c
;if(c
== '.') {a
[i
][j
] = 1;}}}vector
<vector
<int>> left(n
+ 2, vector
<int>(n
+ 2)); vector
<vector
<int>> right(n
+ 2, vector
<int>(n
+ 2));vector
<vector
<int>> up(n
+ 2, vector
<int>(n
+ 2));vector
<vector
<int>> down(n
+ 2, vector
<int>(n
+ 2));for(int i
= 1; i
<= n
; i
++) {for(int j
= 1; j
<= n
; j
++) {if(a
[i
][j
]) {left
[i
][j
] = left
[i
][j
- 1] + 1;up
[i
][j
] = up
[i
- 1][j
] + 1;}left
[i
][j
] = min(left
[i
][j
], k
);up
[i
][j
] = min(up
[i
][j
], k
);}}for(int i
= n
; i
>= 1; i
--) {for(int j
= n
; j
>= 1; j
--) {if(a
[i
][j
]) {right
[i
][j
] = right
[i
][j
+ 1] + 1;down
[i
][j
] = down
[i
+ 1][j
] + 1;}right
[i
][j
] = min(right
[i
][j
], k
);down
[i
][j
] = min(down
[i
][j
], k
);}}int ret
= 0, x
= 1, y
= 1;for(int i
= 1; i
<= n
; i
++) {for(int j
= 1; j
<= n
; j
++) {if(a
[i
][j
]) {int cnt
= max(left
[i
][j
] + right
[i
][j
] - k
, 0) + max(up
[i
][j
] + down
[i
][j
] - k
, 0);if(ret
< cnt
) {ret
= cnt
;x
= i
;y
= j
;}}}}cout
<< x
<< " " << y
<< endl
;return 0;
}
題解:用了類似前綴和的方法去記錄left,right,up,down四個數組,分別表示點(i,j)往左,右,上,下分別可以有多少種變換,變換的最大長度不超過船長,也就是k,最后再把相同的變化去掉,再做比較就可得出最終答案。
總結
以上是生活随笔為你收集整理的3785. 战舰的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。