题目
思路一 遍历扫描
遍历数组,遇到“X”,就把它附近的“X”置为“.”。
代码一
class Solution {
public:
int countBattleships(vector<vector<char>>& board) {
int m=board.size(),n=board[0].size(),cnt=0;
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
if(board[i][j]=='X'){
board[i][j]='.';
cnt++;
for(int k=i+1;k<m && board[k][j]=='X';k++)
board[k][j]='.';
for(int k=j+1;k<n && board[i][k]=='X';k++)
board[i][k]='.';
}
}
}
return cnt;
}
};
思路二 哈希表
使用bool类型的,与原数组同样大小的哈希表存储该数据是否访问过。
代码二
class Solution {
public:
int countBattleships(vector<vector<char>>& board) {
int m=board.size(),n=board[0].size(),cnt=0;
vector<vector<bool>> vis(m,vector<bool>(n,false));
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
if(vis[i][j]==false&&board[i][j]=='X'){
vis[i][j]=true;
cnt++;
for(int k=i+1;k<m&&board[k][j]=='X';k++)
vis[k][j]=true;
for(int k=j+1;k<n&&board[i][k]=='X';k++)
vis[i][k]=true;
}
}
}
return cnt;
}
};
思路三 脑筋急转弯
如果这个位置的左边和上面都是“.”,那就是一个战舰的开头,cnt++。
代码三
class Solution {
public:
int countBattleships(vector<vector<char>>& board) {
int m=board.size(),n=board[0].size(),cnt=0;
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
if(board[i][j]=='X'&&(!i||board[i-1][j]=='.')&&(!j||board[i][j-1]=='.'))
cnt++;
}
}
return cnt;
}
};