在其中寻找到所有只包含X(表示战舰)或O(表示水)且没有相邻格子有其他字符的战舰,我们可以使用一个二维数组来记录每个位置是否已经被访问过。
作为一名程序员,我们时常需要解决各种有趣的问题。而LeetCode则是一个非常好的平台,可以让我们在编程中不断挑战自己。今天要介绍的题目是“数组419. 甲板上的战舰”。
10年积累的成都网站制作、网站建设经验,可以快速应对客户对网站的新想法和需求。提供各种问题对应的解决方案。让选择我们的客户得到更好、更有力的网络服务。我虽然不认识你,你也不认识我。但先网站设计后付款的网站建设流程,更有全州免费网站建设让你可以放心的选择与我们合作。
这道题目其实很简单,但是却能够帮助我们加深对于数组和逻辑判断等知识点之间关系的理解。
首先来看一下题目描述:
给定一个二维矩阵,在其中寻找到所有只包含X(表示战舰)或O(表示水)且没有相邻格子有其他字符的战舰,并返回其数量。
注意:相邻格子指横向或纵向连接在一起。
例如:
X..X
...X
以上面这个例子为例,我们可以发现其中存在两艘长度分别为2和1的战舰。而如果将它们转化成0和1,则会变成以下形式:
1101
0011
从上面这个示意图中可以看出来,原本连通区域内部都被填充了数字1。而对于外边界以及与其他联通块接触处,则被标记为数字0。
根据这样一个思路,在代码实现中,我们可以使用一个二维数组来记录每个位置是否已经被访问过。如果当前位置是X,并且它的上下左右都没有其他字符,则表示这里存在一艘战舰。
代码实现如下:
```
class Solution {
public:
int countBattleships(vector
int m = board.size(), n = board[0].size();
vector
int res = 0;
for (int i = 0; i< m; ++i) {
for (int j = 0; j< n; ++j) {
if (!visited[i][j] && board[i][j] == 'X') { // 如果当前位置未被访问并且有战舰
bool is_battle_ship = true;
// 检查上下左右四个方向是否均为水或者未曾遍历
if (i > 0 && board[i-1][j] == 'X' && visited[i-1][j]) is_battle_ship = false;
if (i< m - 1 && board[i+1][j] == 'X' && visited[i+1][j]) is_battle_ship = false;
if (j > 0 && board[i][j-1] == 'X' && visited[i][j-1]) is_battle_ship= false;
if (j< n - 1&&board[i][j+1]=='X'&&visited [i ][ j + l ])is_ battle _ship=false;
// 如果符合条件,就标记所有连通区域为已访问,并将战舰数+1
if (is_battle_ship) {
int x = i, y = j;
while (x >= 0 && board[x][j] == 'X' && !visited[x][j]) visited[x--][j] = true;
while (y >= 0 && board[i][y] == 'X' && !visited[i][y]) visited[i][y--] = true;
res++;
}
}
}
}
return res;
}
};
以上就是这道题目的解法。虽然看起来很简单,但是在实现过程中也能够锻鍊我们对于数组和逻辑判断等知识点之间关系的理解。
代码练习不仅可以提高我们的编程技能,还能够帮助我们加深对于各种算法问题的理解。因此,在平时学习中一定要多加练习,才能更好地掌握各种编程技巧。
最后,希望大家都可以成为优秀的程序员!
文章标题:每日LeetCode:数组419.甲板上的战舰
路径分享:http://www.36103.cn/qtweb/news0/30200.html
网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联