1. 题号和题目名称
- 甲板上的战舰
2. 题目叙述
给定一个二维的甲板, 请计算其中有多少艘战舰。 战舰用 'X'
表示,空位用 '.'
表示。 你需要遵守以下规则:
- 给你一个有效的甲板,由只包含
'X'
和'.'
的二维数组组成。 - 战舰只能水平或者垂直放置。换句话说,战舰只能由
1 x k
(1
行,k
列)或k x 1
(k
行,1
列)的形状组成,其中k
可以是任意大小。 - 两艘战舰之间至少有一个水平或垂直的空位分隔 - 即没有相邻的战舰。
示例:
输入:
[["X",".",".","X"],
[".",".",".","X"],
[".",".",".","X"]]
输出:2
解释:在上面的甲板中有 2 艘战舰。
3. 模式识别
本题可以通过深度优先搜索(DFS)或简单的计数方法来解决。由于战舰之间有间隔,我们可以通过遍历二维数组,当遇到 'X'
时,判断它是否是战舰的左上角(即其上方和左方都不是 'X'
),如果是,则表示发现了一艘新的战舰。
4. 考点分析
- 二维数组遍历:需要遍历整个二维数组来检查每个元素。
- 条件判断:根据战舰的规则,判断每个
'X'
是否是新战舰的一部分。
5. 所有解法
- 计数法:遍历二维数组,通过判断
'X'
的位置来计数战舰数量,这是最优解法。 - 深度优先搜索(DFS):当遇到
'X'
时,进行深度优先搜索标记整个战舰,然后计数战舰数量。
6. 最优解法(计数法)的 C 语言代码
#include <stdio.h>
// 计算甲板上战舰的数量
int countBattleships(char*