• 締切済み

黒の塊の数え方

■■□□■■■■ □■■■■□□□ □□□□□□□□ ■□□■■■■■ ■□□■■■■■ ■■□■□■□■ □■□□□■□■ □■□■■■■■ こういうテキストがあったときに ■の塊を数えるプログラムを教えてください このテキストの場合は 黒 = 3になります言語はC#でお願いします できれば解説もお願いします

みんなの回答

noname#208507
noname#208507
回答No.4

「ラベリング」は画像のサイズを縦横ともに2画素増やして、画像を囲むように外側1画素を「境界」で塗りつぶすと、例外処理が不要になるので、ちょっと幸せになれる(かも)。 ラベリングの具体的な方法は、Webを検索するなり、初級の画像処理の教科書を見れば、たくさん見つかるでしょう。

  • honor
  • ベストアンサー率35% (25/71)
回答No.3

画像処理のラベリングですね。 連続した領域に同じ数値を振っていく方法です。

  • Wr5
  • ベストアンサー率53% (2173/4061)
回答No.2

コード書く気はありませんし、検証もしていませんが… とりあえず…… 基準点を決める。 (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 って感じになりますかね。(崩れていたら等幅フォントで見てくださいな) で、配列内の最大値が「■の塊の個数」ということに。

  • maiko0318
  • ベストアンサー率21% (1483/6969)
回答No.1

>このテキストの場合は 黒 = 3になります どこをどう見たら黒=3になるのですか?

関連するQ&A

専門家に質問してみよう