buaacoding 海洋與陸地

2021-09-20 15:42:30 字數 1529 閱讀 9057

本來乙個很簡單的題因為乙個極其愚蠢的錯誤卡了非常久……

輸入:輸入n+1行,第一行為正整數n,表示地圖的大小,n<=100

之後n行每行輸入n個字元,由*和#組成,其中*表示海洋,#表示陸地

兩塊陸地在上下左右四個方向上有間接接壤視為同屬於乙個大陸

例如

*#

#*

視為擁有兩塊大陸

輸出:有多少塊大陸

輸入樣例

5

*###*

**##*#**

**#*#***

**##

輸出樣例

4
每碰到一塊大陸,就計數,然後把這一整塊大陸變成海洋,使其不對後續的計數產生干擾。

由於某一塊大陸可能有非常多的土地接壤,考慮用遞迴來實現所有陸地的反轉。

符號並不重要,將地圖二值化,*->0->海洋,#->1->陸地

採用加邊法來規避陣列越界的問題,將實際操作的範圍規定為[1,n]*[1,n]而非從0開始計數,雖然浪費了空間,但是使得i-1和j-1的訪問在物理上不會越界,不會導致程式卡死的問題,同時也簡化了程式設計的邏輯。

讀入時需要注意n後的回車要吃掉,每行字串後面的回車也要吃掉,否則會導致讀入的陣列不正常。

之前卡了很長一段時間,是因為我在定義了乙個全域性變數n之後,寫主函式時又手賤定義了乙個n。

根據語法,這沒有任何錯誤,在區域性變數與全域性變數重名時,函式內使用區域性變數,這是語言的特性,也不止c有。

可是這就導致讀入的n並沒有儲存到全域性的n中,子函式中訪問到的n都是0,於是全部都工作不正常,都沒輸出……

我還納悶咋沒輸出……還以為是遞迴的問題,調了半天,後來嘗試想把列印陣列的過程寫成子函式的時候發現了錯誤。實屬hape。

和過去的兩個題有點像,特別是前者。

計算機導論模擬測試練習(2023年秋)i. 燈矩陣

第四次機考(2019)d. 衛星**二

#include

#define max 100

int n;

int map[max+2]

[max+2]

=;void

reverse

(int i,

int j)

;int

main

(int argc,

char

const

*ar**)

for(i=

1;i<=n;

++i)

for(j=

1;j<=n;

++j)

if(map[i]

[j])

printf

("%d\n"

,cnt )

;return0;

}void

reverse

(int i,

int j)

一片海洋中的陸地

這個題目是很霸氣的,這是一道演算法題。給定乙個棋盤,n n大小,可以把它想象成一片海洋,每個格仔裡面是0或者1,0代表海水,1代表土壤,求海洋中陸地的塊數。今晚吃晚飯時聽學長分享了這個面試題,於是回來尋思著怎麼做。說實話,這個題目昨晚和學長交談時有dfs的想法,回來卻不敢去實現,看了leetcode...

陸地移動距離

include stdafx.h include include include include pragma comment lib,cv.lib pragma comment lib,cvcam.lib pragma comment lib,cxcore.lib pragma comment l...

縮小的陸地

問題描述 fred正在考慮在路易斯安那州找一塊土地在上面建造他的房子。在調查過程中,他了解到路易斯安那州的陸地正以每年50平方英里的速度縮小,原因是密西西比河對陸地的侵蝕。由於fred希望他的餘生都能居住在這所房子裡,所以他需要知道他的土地是否會被河水侵蝕。fred做了更多的研究後發現,正在損失的陸...