สมมติว่าเรามีกระดาน 2D เราต้องนับว่ามีเรือประจัญบานอยู่ในนั้นกี่ลำ เรือประจัญบานจะแสดงด้วยสัญลักษณ์ 'X' ช่องว่างจะแสดงด้วย '.' เราสามารถสมมติกฎเหล่านี้ได้ -
-
คุณได้รับกระดานที่ถูกต้อง ซึ่งสร้างจากเรือประจัญบานหรือช่องว่าง
-
เรือประจัญบานสามารถวางในแนวนอนหรือแนวตั้งเท่านั้น กล่าวคือ สามารถสร้างรูปร่างได้เพียง 1xN (1 แถว, N คอลัมน์) หรือ Nx1 (แถว N, 1 คอลัมน์) โดยที่ N สามารถมีขนาดใดก็ได้
-
อย่างน้อยหนึ่งช่องแนวนอนหรือแนวตั้งแยกระหว่างสองเรือประจัญบาน - ไม่มีเรือประจัญบานอยู่ติดกัน
ดังนั้นหากกระดานมีลักษณะดังนี้:
X | X | ||
X | |||
X |
จากนั้นผลลัพธ์จะเป็น 2 เนื่องจากมีเรือประจัญบานสองลำ
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
-
ans :=0, n :=จำนวนแถวและ m :=จำนวนคอลัมน์
-
สำหรับแถวนั้น
-
สำหรับคอลัมน์ที่ j
-
ถ้า board[i, j] เป็นจุด ให้ทำซ้ำต่อไป
-
ถ้า i> 0 และบอร์ด[i – 1, j] ='X' ให้ทำซ้ำต่อไป
-
ถ้า j> 0 และ board[i, j - 1] ='X' ให้ทำซ้ำต่อไป
-
เพิ่มขึ้น 1
-
-
-
กลับมาอีกครั้ง
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
ตัวอย่าง
#include <bits/stdc++.h> using namespace std; class Solution { public: int countBattleships(vector<vector<char>>& board) { int ans = 0; int n = board.size(); int m = board[0].size(); for(int i = 0; i < n; i++){ for(int j = 0; j < m; j++){ if(board[i][j] == '.')continue; if(i > 0 && board[i - 1][j] == 'X')continue; if(j > 0 && board[i][j - 1] == 'X')continue; ans++; } } return ans; } }; main(){ vector<vector<char>> v = {{'X','.','.','X'},{'.','.','.','X'},{'.','.','.','X'}}; Solution ob; cout << (ob.countBattleships(v)); }
อินพุต
[["X",".",".","X"],[".",".",".","X"],[".",".",".","X"]]
ผลลัพธ์
2