2次元配列の、黒いマス目で囲まれた白いマス目の数の計算

解決済みの質問

2次元配列の、黒いマス目で囲まれた白いマス目の数の計算

100×100のマス目があって、白と黒に塗り分けられている。
この中に、黒い点で囲まれた図形がただ一つある。
ここで”囲まれている”とは、黒い点の周り8点のいづれかが黒い点であることを表すとする。

図形は整数値の2次元配列で表されていて、x軸は左から右、y軸は上から下として、この配列はプログラムに入る前に何らかの方法で、白い点は”0”。黒い点は”1”となっているものとする。

こんな時、黒い点は端点には存在しない(十分真ん中にある)として、白い点の数、つまり面積を計算するプログラムを作って欲しいのですが・・

どうかお正月が終わるぐらいまでにお願いしますm(__)m



あっすいません。
言語はCと書きましたが、何でもいいです。
誰かプログラムに詳しい方、
何も知らない素人の私にプログラムを教えてください。

投稿日時 - 2006-12-28 11:52:32

連想キーワード:

QNo.2630443

すぐに回答ほしいです

質問者が選んだベストアンサー

どうやら意図してる事と違う回答だったみたいだからNo2にも書かれてる事だしこっちに。

要するに「囲碁のようなルールで黒で囲まれた白い土地の面積を求めたい(但し囲まれている空間は1つしかない)」で良い事になるのかな。
No2の補足からすると。

私が思いつくのは塗りつぶしてからまたは塗りつぶせる場所を判定する方法
ただ
□□□□□□□□□
□■□□□□□□□
□□□□□□□□□
□□■■■■■□□
□□■□□□■□□
□□■□□□■□□
□□■■■■■□□
□□□□□□□□□
このような場合でも対応できなければならないと考える。
なぜならば
□□□□□□□□□
□■■■□□□□□
□■□□■□□□□
□■□□■■□□□
□□■□■□■□□
□□■□□□■□□
□□□■■■□□□
□□□□□□□□□
前提からするとこれも該当図形だから
ただし
■■□□□□□□□
□■□□□□□□□
□□□□□□□□□
□□■■■■■□□
□□■□□□■□□
□□■□□□■□□
□□■■■■■□□
□□□□□□□□□
こういうのは判定できる必要がない、と定義されている(黒が端に存在する

この前提環境を満たす為には「外周は必ず白でなければならない」
よって、白い点(0)が出現次第(必ずx0,y0に出現しちゃうけど)、黒以外の値(この場合-1や2等)で「境界線内の塗り潰し」を実行する。
境界は斜めにははみ出さない事になっているからそんなに難しくは無いが
「スタック」(やり方によってはキュー)と呼ばれる配列の使用方法あるいはあるいは再帰呼び出し(リカーシブコール)を駆使する事になる。
その上で残った0を数えれば良い
外周にも1(黒)が存在する場合でも可能とせよ、となる場合は塗りつぶしてる間に外周と接点があるかどうかで対象判定(内輪)かどうかを識別しておく(外周接点フラグでも用意しておけば良い)

投稿日時 - 2006-12-28 13:35:08

補足

丁寧な回答ありがとうございます。

すみませんが私はプログラムを文字通り全く習ったことがありません。

考え方はわかってきました。

つまり囲まれていない白の点に、白でも黒でもない違う属性を与えた後に、
全体の白を数えればいい、
ということですよね?

しかし、私はそのプログラムの書き方が何一つわからないのです。

どうか、どうか回答例を示してくださいませんか。

投稿日時 - 2006-12-28 13:46:23

ANo.3

0人が「このQ&Aが役に立った」と投票しています

[  前へ  |  次へ ]

ベストアンサー以外の回答(4件中 1~4件目)

ANo.5

丸投げをするなら丸投げでもOKなサイトでお願いします。

http://l.huu.cc/

投稿日時 - 2006-12-28 16:02:05

ANo.4

>白でも黒でもない違う属性を与えた後に、
>全体の白を数えればいい
その通り。
これは数える白の島は1つであると環境定義されているから可能なやり方でもある。


あと、言うつもりなかったけど敢えて書いとく
何というか プログラムするには どういう処理を構築するか、を学んだ方が良いよ。
コーディングしてすぐゲームとか作りたい! というのは良くわかるけど。
結局構築論が無いと行き当たりばったりなソースになって(以下略)

>何も知らない素人
にもかかわらず「配列」という言葉が出てきている。
宿題丸投げなら諦めて同級生に聞いた方が良いよ。
実は宿題だったけど提出が間に合わなくてもやりたい、というならきっと皆は まだまだ力になってくれると思う

投稿日時 - 2006-12-28 14:25:10

補足

配列が出てきたのは問題に配列という言葉が出てきたからです。

とにかくすみません。

それと式を書いて欲しいのは、rubyしかやったことがないからです。

SAYKAさんのアドバイスから、自分なりにrubyなんですけど本をみてやって見たんですが、動作しますか??

点がa[x,y]で与えられているとして、
0~99までxとyが動くとするとして、

y = 0

while y == 99
x = 0
while a[x,y] == 1
if a[x,y] == 0
a[x,y] = -1
end
x = x + 1
end
y = y + 1
end

y = 0
while y == 99
x = 99
while a[x,y] == 1
if a[x,y] == 0
a[x,y] = -1
end
x = x - 1
end
y = y + 1
end

s = 0
y = 0
while y == 99
x = 0
while x == 99
if a[x,y] == 0
s = s + 1
end
x = x + 1
end
y = y + 1
end

print s

投稿日時 - 2006-12-28 15:37:18

ANo.2

重複投稿は規約違反です。

前の質問に「補足要求」を出しましたので、質問自体削除しましょう。

ちょっと、わかりにくいのですが・・・
「白と黒に塗り分けられている。」
「黒い点で囲まれた図形がただ一つある。」
「黒い点は端点には存在しない(十分真ん中にある)」
この3個がいまいちのみこめないのですが、
□□□□□□□□□□
□□■■■■■■□□
□□■□□□□■□□
□□■□□□□■□□
□□■□□□□■□□
□□■■■■■■□□
□□□□□□□□□□
□□□□□□□□□□
□□□□□□□□□□
□□□□□□□□□□
こういうことですか?

投稿日時 - 2006-12-28 12:08:54

補足

>edominさん

すみません。
初めて書き込んだものでよく勝手がわからなかったんです。

舌足らずですみませんそうゆうことです。

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

上のようにずれていてもかまいません。

投稿日時 - 2006-12-28 12:18:20

ANo.1

既に回答がついているので誘導

http://internet.okwave.jp/qa2630437.html

投稿日時 - 2006-12-28 12:05:56

あわせてチェックしたい
  • 2次元配列の、黒いマス目で囲まれた白いマス目の数の計算 ...
  • 面積 ...
  • 2次元配列でのiとjについて。 ...
PR
【回答募集中】花粉にひと言、物申す![ 詳細 ]

OKWaveのオススメ

教えて弁護士さん!

お金の悩みQ&A特集はこちら