件名の説明:
グリッド上のN * N、我々はいくつかのキューブ* 1 * 1を入れました。
各値v =グリッド[i] [j]は、対応するセル(i、j)の上に重ねVキューブを表します。
最終体表面積に戻ってください。
例:
入力:[[2]] 出力:10
入力:[1,2]、[3,4] 出力:34
入力:[[1,0]、[0,2 ]]
出力: 16
入力:[[1,1,1]、[1,0,1]、[1,1,1 ]]
出力: 32
入力:[[2,2,2]、[2,1,2]、[2,2,2 ]]
出力: 46
問題解決のアイデア:
質問は、〜を(私は最初のアイデアのタイトルを見て)読んでいません。入力サンプルの表現の意味を説明します。
例1:細胞内の座標(0,0)に2つのキューブを置きます。
例2:細胞内の座標(0,0)にキューブを入れます。セルの2つの立方体の座標(0,1)を置きます。放電3つのキューブ内のセルの座標(1,0)。放電4個のキューブでセル座標(1,1)。
....
次に、実際に、これらのキューブの意味の主題は、被覆部の表面積の他の部分に加えて得られた、この質問を見てください。実施例又は入力サンプル。
実施例1:(0,0)が遮断される2つの面、他の部分(2×6の表面積を有する2つのキューブ、2つのキューブ(他の上方に配置された1)と、この山を有し、 - 2 * 1 => 2つのキューブ、それぞれが6つの面、2面覆われ、各正方形)= 10。
実施例2:10個のキューブの合計、表面26を覆い、他の部分(10 * 6--26 * 1)= 34の表面積。
....
もっと徹底的に少しを理解するコードを見てください。また、紙の上に自分のマップを描画するようにしてください。
コード:
ソリューションクラス:
DEFの表面積(セルフ、グリッド:リスト[一覧[INT]]) - > int型:
IF LEN(グリッド)== 0:
リターン0
ブロック= 0#合計何統計キューブ
カバー= 0#统计有多少个面被其他面盖住,在所有的立方体的表面积上减去被盖住的面数×2
以下のための範囲(LEN(グリッド))におけるI:
:範囲でJ(LEN(グリッド[I]))のための
IFグリッド[I]、[J]> 0:
ブロック+ =グリッド[I] [J]
表紙+ =グリッド[I]、[J] - 1。
IF I> 0:
表紙+ =分(グリッド[I - 1]〜[J]、グリッド[I] [J])と同じ行番号に、積層された2つのセルを比較します小さな取る立方体の数、
IF J> 0:
表紙+ =分(グリッド[I] [J - 1]、グリッド[I]は[J])#同様
戻りブロック* 6 -カバー* 2