掃二維碼與項(xiàng)目經(jīng)理溝通
我們在微信上24小時期待你的聲音
解答本文疑問/技術(shù)咨詢/運(yùn)營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流
在其中尋找到所有只包含X(表示戰(zhàn)艦)或O(表示水)且沒有相鄰格子有其他字符的戰(zhàn)艦,我們可以使用一個二維數(shù)組來記錄每個位置是否已經(jīng)被訪問過。
作為一名程序員,我們時常需要解決各種有趣的問題。而LeetCode則是一個非常好的平臺,可以讓我們在編程中不斷挑戰(zhàn)自己。今天要介紹的題目是“數(shù)組419. 甲板上的戰(zhàn)艦”。

10年積累的成都網(wǎng)站制作、網(wǎng)站建設(shè)經(jīng)驗(yàn),可以快速應(yīng)對客戶對網(wǎng)站的新想法和需求。提供各種問題對應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識你,你也不認(rèn)識我。但先網(wǎng)站設(shè)計(jì)后付款的網(wǎng)站建設(shè)流程,更有全州免費(fèi)網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。
這道題目其實(shí)很簡單,但是卻能夠幫助我們加深對于數(shù)組和邏輯判斷等知識點(diǎn)之間關(guān)系的理解。
首先來看一下題目描述:
給定一個二維矩陣,在其中尋找到所有只包含X(表示戰(zhàn)艦)或O(表示水)且沒有相鄰格子有其他字符的戰(zhàn)艦,并返回其數(shù)量。
注意:相鄰格子指橫向或縱向連接在一起。
例如:
X..X
...X
以上面這個例子為例,我們可以發(fā)現(xiàn)其中存在兩艘長度分別為2和1的戰(zhàn)艦。而如果將它們轉(zhuǎn)化成0和1,則會變成以下形式:
1101
0011
從上面這個示意圖中可以看出來,原本連通區(qū)域內(nèi)部都被填充了數(shù)字1。而對于外邊界以及與其他聯(lián)通塊接觸處,則被標(biāo)記為數(shù)字0。
根據(jù)這樣一個思路,在代碼實(shí)現(xiàn)中,我們可以使用一個二維數(shù)組來記錄每個位置是否已經(jīng)被訪問過。如果當(dāng)前位置是X,并且它的上下左右都沒有其他字符,則表示這里存在一艘戰(zhàn)艦。
代碼實(shí)現(xiàn)如下:
```
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') { // 如果當(dāng)前位置未被訪問并且有戰(zhàn)艦
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;
// 如果符合條件,就標(biāo)記所有連通區(qū)域?yàn)橐言L問,并將戰(zhàn)艦數(shù)+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;
}
};
以上就是這道題目的解法。雖然看起來很簡單,但是在實(shí)現(xiàn)過程中也能夠鍛鍊我們對于數(shù)組和邏輯判斷等知識點(diǎn)之間關(guān)系的理解。
代碼練習(xí)不僅可以提高我們的編程技能,還能夠幫助我們加深對于各種算法問題的理解。因此,在平時學(xué)習(xí)中一定要多加練習(xí),才能更好地掌握各種編程技巧。
最后,希望大家都可以成為優(yōu)秀的程序員!

我們在微信上24小時期待你的聲音
解答本文疑問/技術(shù)咨詢/運(yùn)營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流