• ベストアンサー

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

100×100のマス目があって、白と黒に塗り分けられている。 この中に、黒い点で囲まれた図形がただ一つある。 ここで”囲まれている”とは、黒い点の周り8点のいづれかが黒い点であることを表すとする。 図形は整数値の2次元配列で表されていて、x軸は左から右、y軸は上から下として、この配列はプログラムに入る前に何らかの方法で、白い点は”0”。黒い点は”1”となっているものとする。 こんな時、黒い点は端点には存在しない(十分真ん中にある)として、白い点の数、つまり面積を計算するプログラムを作って欲しいのですが・・ どうかお正月が終わるぐらいまでにお願いしますm(__)m あっすいません。 言語はCと書きましたが、何でもいいです。 誰かプログラムに詳しい方、 何も知らない素人の私にプログラムを教えてください。

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

  • ベストアンサー
noname#39970
noname#39970
回答No.3

どうやら意図してる事と違う回答だったみたいだからNo2にも書かれてる事だしこっちに。 要するに「囲碁のようなルールで黒で囲まれた白い土地の面積を求めたい(但し囲まれている空間は1つしかない)」で良い事になるのかな。 No2の補足からすると。 私が思いつくのは塗りつぶしてからまたは塗りつぶせる場所を判定する方法 ただ □□□□□□□□□ □■□□□□□□□ □□□□□□□□□ □□■■■■■□□ □□■□□□■□□ □□■□□□■□□ □□■■■■■□□ □□□□□□□□□ このような場合でも対応できなければならないと考える。 なぜならば □□□□□□□□□ □■■■□□□□□ □■□□■□□□□ □■□□■■□□□ □□■□■□■□□ □□■□□□■□□ □□□■■■□□□ □□□□□□□□□ 前提からするとこれも該当図形だから ただし ■■□□□□□□□ □■□□□□□□□ □□□□□□□□□ □□■■■■■□□ □□■□□□■□□ □□■□□□■□□ □□■■■■■□□ □□□□□□□□□ こういうのは判定できる必要がない、と定義されている(黒が端に存在する この前提環境を満たす為には「外周は必ず白でなければならない」 よって、白い点(0)が出現次第(必ずx0,y0に出現しちゃうけど)、黒以外の値(この場合-1や2等)で「境界線内の塗り潰し」を実行する。 境界は斜めにははみ出さない事になっているからそんなに難しくは無いが 「スタック」(やり方によってはキュー)と呼ばれる配列の使用方法あるいはあるいは再帰呼び出し(リカーシブコール)を駆使する事になる。 その上で残った0を数えれば良い 外周にも1(黒)が存在する場合でも可能とせよ、となる場合は塗りつぶしてる間に外周と接点があるかどうかで対象判定(内輪)かどうかを識別しておく(外周接点フラグでも用意しておけば良い)

cyoneco
質問者

補足

丁寧な回答ありがとうございます。 すみませんが私はプログラムを文字通り全く習ったことがありません。 考え方はわかってきました。 つまり囲まれていない白の点に、白でも黒でもない違う属性を与えた後に、 全体の白を数えればいい、 ということですよね? しかし、私はそのプログラムの書き方が何一つわからないのです。 どうか、どうか回答例を示してくださいませんか。

その他の回答 (4)

回答No.5

丸投げをするなら丸投げでもOKなサイトでお願いします。 http://l.huu.cc/

noname#39970
noname#39970
回答No.4

>白でも黒でもない違う属性を与えた後に、 >全体の白を数えればいい その通り。 これは数える白の島は1つであると環境定義されているから可能なやり方でもある。 あと、言うつもりなかったけど敢えて書いとく 何というか プログラムするには どういう処理を構築するか、を学んだ方が良いよ。 コーディングしてすぐゲームとか作りたい! というのは良くわかるけど。 結局構築論が無いと行き当たりばったりなソースになって(以下略) >何も知らない素人 にもかかわらず「配列」という言葉が出てきている。 宿題丸投げなら諦めて同級生に聞いた方が良いよ。 実は宿題だったけど提出が間に合わなくてもやりたい、というならきっと皆は まだまだ力になってくれると思う

cyoneco
質問者

補足

配列が出てきたのは問題に配列という言葉が出てきたからです。 とにかくすみません。 それと式を書いて欲しいのは、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

  • edomin
  • ベストアンサー率32% (327/1003)
回答No.2

重複投稿は規約違反です。 前の質問に「補足要求」を出しましたので、質問自体削除しましょう。 ちょっと、わかりにくいのですが・・・ 「白と黒に塗り分けられている。」 「黒い点で囲まれた図形がただ一つある。」 「黒い点は端点には存在しない(十分真ん中にある)」 この3個がいまいちのみこめないのですが、 □□□□□□□□□□ □□■■■■■■□□ □□■□□□□■□□ □□■□□□□■□□ □□■□□□□■□□ □□■■■■■■□□ □□□□□□□□□□ □□□□□□□□□□ □□□□□□□□□□ □□□□□□□□□□ こういうことですか?

cyoneco
質問者

補足

>edominさん すみません。 初めて書き込んだものでよく勝手がわからなかったんです。 舌足らずですみませんそうゆうことです。 □□□□□□□□□□ □□■■■■■■□□ □■□□□□■□□□ □□■□□□□■□□ □□■□□□□■□□ □□■■■■■■□□ □□□□□□□□□□ □□□□□□□□□□ □□□□□□□□□□ □□□□□□□□□□ 上のようにずれていてもかまいません。

noname#39970
noname#39970
回答No.1

既に回答がついているので誘導 http://internet.okwave.jp/qa2630437.html

関連するQ&A