電子書籍の厳選無料作品が豊富!

■■□□■■■■
□■■■■□□□
□□□□□□□□
■□□■■■■■
■□□■■■■■
■■□■□■□■
□■□□□■□■
□■□■■■■■

こういうテキストがあったときに
■の塊を数えるプログラムを教えてください


このテキストの場合は

黒 = 3になります言語はC#でお願いします


できれば解説もお願いします

A 回答 (4件)

「ラベリング」は画像のサイズを縦横ともに2画素増やして、画像を囲むように外側1画素を「境界」で塗りつぶすと、例外処理が不要になるので、ちょっと幸せになれる(かも)。



ラベリングの具体的な方法は、Webを検索するなり、初級の画像処理の教科書を見れば、たくさん見つかるでしょう。
    • good
    • 0

画像処理のラベリングですね。


連続した領域に同じ数値を振っていく方法です。
    • good
    • 0

コード書く気はありませんし、検証もしていませんが…



とりあえず……
基準点を決める。
(0,0)ですかね。
基準点が"■"でなければ移動して新たに基準点を策定し直し。
"■"だったら上下左右の隣接する箇所に"■"があるか判定。
連接箇所に"■"が1つもなければ、塊になっていないぼっちの"■"としてカウントして基準点走査に。
隣接箇所にあったらそちらの隣接部分を基準点その2として、その隣接領域に"■"があるか判定。
って感じで走査…ですかねぇ……。

ん~……int型の二次元配列を用意する。
外周分も含めて[10][10]。
全部-1(未調査領域フラグ)で初期化して、外周部分を0("□"相当)に設定。
[1][1]からスタートで取りあえず1を設定。
先ほどの処理で"□"だったら対応する箇所に0を、"■"だったら基準点その2に移動して該当箇所に1を設定。
隣接区域を調べる際に1だったら調査済み。として調査を続行して、塊の周りにある"□"が確定したら次の基準点(-1)の箇所へ。
新たに"■"が見つかったら次は2をおいて同様の処理で固まりを……
と繰り返していく感じでしょうかねぇ。

マインスイーパーなんかで安全地帯を探すアルゴリズムみたいなモンでしょうか?
# 経路探索とは違うよなぁ…。
# ゲームなんかでユニットの移動範囲を検索するアルゴリズムに似て…はいるかなぁ?
# 移動距離無限大、進入禁止領域あり。みたいな。

最終的に…
0000000000
0110011110
0011110000
0000000000
0200333330
0200333330
0220303030
0020003030
0020333330
0000000000
って感じになりますかね。(崩れていたら等幅フォントで見てくださいな)
で、配列内の最大値が「■の塊の個数」ということに。
    • good
    • 0

>このテキストの場合は 黒 = 3になります



どこをどう見たら黒=3になるのですか?
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!