本來乙個很簡單的題因為乙個極其愚蠢的錯誤卡了非常久……
輸入:輸入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做了更多的研究後發現,正在損失的陸...