100×100のマス目があって、白と黒に塗り分けられている。
この中に、黒い点で囲まれた図形がただ一つある。
ここで”囲まれている”とは、黒い点の周り8点のいづれかが黒い点であることを表すとする。
図形は整数値の2次元配列で表されていて、x軸は左から右、y軸は上から下として、この配列はプログラムに入る前に何らかの方法で、白い点は”0”。黒い点は”1”となっているものとする。
こんな時、黒い点は端点には存在しない(十分真ん中にある)として、白い点の数、つまり面積を計算するプログラムを作って欲しいのですが・・
どうかお正月が終わるぐらいまでにお願いしますm(__)m
あっすいません。
言語はCと書きましたが、何でもいいです。
誰かプログラムに詳しい方、
何も知らない素人の私にプログラムを教えてください。
No.3ベストアンサー
- 回答日時:
どうやら意図してる事と違う回答だったみたいだからNo2にも書かれてる事だしこっちに。
要するに「囲碁のようなルールで黒で囲まれた白い土地の面積を求めたい(但し囲まれている空間は1つしかない)」で良い事になるのかな。
No2の補足からすると。
私が思いつくのは塗りつぶしてからまたは塗りつぶせる場所を判定する方法
ただ
□□□□□□□□□
□■□□□□□□□
□□□□□□□□□
□□■■■■■□□
□□■□□□■□□
□□■□□□■□□
□□■■■■■□□
□□□□□□□□□
このような場合でも対応できなければならないと考える。
なぜならば
□□□□□□□□□
□■■■□□□□□
□■□□■□□□□
□■□□■■□□□
□□■□■□■□□
□□■□□□■□□
□□□■■■□□□
□□□□□□□□□
前提からするとこれも該当図形だから
ただし
■■□□□□□□□
□■□□□□□□□
□□□□□□□□□
□□■■■■■□□
□□■□□□■□□
□□■□□□■□□
□□■■■■■□□
□□□□□□□□□
こういうのは判定できる必要がない、と定義されている(黒が端に存在する
この前提環境を満たす為には「外周は必ず白でなければならない」
よって、白い点(0)が出現次第(必ずx0,y0に出現しちゃうけど)、黒以外の値(この場合-1や2等)で「境界線内の塗り潰し」を実行する。
境界は斜めにははみ出さない事になっているからそんなに難しくは無いが
「スタック」(やり方によってはキュー)と呼ばれる配列の使用方法あるいはあるいは再帰呼び出し(リカーシブコール)を駆使する事になる。
その上で残った0を数えれば良い
外周にも1(黒)が存在する場合でも可能とせよ、となる場合は塗りつぶしてる間に外周と接点があるかどうかで対象判定(内輪)かどうかを識別しておく(外周接点フラグでも用意しておけば良い)
この回答への補足
丁寧な回答ありがとうございます。
すみませんが私はプログラムを文字通り全く習ったことがありません。
考え方はわかってきました。
つまり囲まれていない白の点に、白でも黒でもない違う属性を与えた後に、
全体の白を数えればいい、
ということですよね?
しかし、私はそのプログラムの書き方が何一つわからないのです。
どうか、どうか回答例を示してくださいませんか。
No.4
- 回答日時:
>白でも黒でもない違う属性を与えた後に、
>全体の白を数えればいい
その通り。
これは数える白の島は1つであると環境定義されているから可能なやり方でもある。
あと、言うつもりなかったけど敢えて書いとく
何というか プログラムするには どういう処理を構築するか、を学んだ方が良いよ。
コーディングしてすぐゲームとか作りたい! というのは良くわかるけど。
結局構築論が無いと行き当たりばったりなソースになって(以下略)
>何も知らない素人
にもかかわらず「配列」という言葉が出てきている。
宿題丸投げなら諦めて同級生に聞いた方が良いよ。
実は宿題だったけど提出が間に合わなくてもやりたい、というならきっと皆は まだまだ力になってくれると思う
この回答への補足
配列が出てきたのは問題に配列という言葉が出てきたからです。
とにかくすみません。
それと式を書いて欲しいのは、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
No.2
- 回答日時:
重複投稿は規約違反です。
前の質問に「補足要求」を出しましたので、質問自体削除しましょう。
ちょっと、わかりにくいのですが・・・
「白と黒に塗り分けられている。」
「黒い点で囲まれた図形がただ一つある。」
「黒い点は端点には存在しない(十分真ん中にある)」
この3個がいまいちのみこめないのですが、
□□□□□□□□□□
□□■■■■■■□□
□□■□□□□■□□
□□■□□□□■□□
□□■□□□□■□□
□□■■■■■■□□
□□□□□□□□□□
□□□□□□□□□□
□□□□□□□□□□
□□□□□□□□□□
こういうことですか?
この回答への補足
>edominさん
すみません。
初めて書き込んだものでよく勝手がわからなかったんです。
舌足らずですみませんそうゆうことです。
□□□□□□□□□□
□□■■■■■■□□
□■□□□□■□□□
□□■□□□□■□□
□□■□□□□■□□
□□■■■■■■□□
□□□□□□□□□□
□□□□□□□□□□
□□□□□□□□□□
□□□□□□□□□□
上のようにずれていてもかまいません。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語 配列の長さの上限
-
配列を使わずに、変数名を動的...
-
配列で格納したものをmsgboxで...
-
C言語で特定列だけを抽出して配...
-
C言語初心者 ポインタについて...
-
配列をEraseしてもメモリが開放...
-
VBで動的なメモリの確保
-
C# Listを使わずに2次元配列の...
-
先頭アドレスとは何ですか?
-
【速いブラインドタッチ】手を...
-
C# 配列の変数宣言について。
-
VB.NET 構造体の配列の検索機能...
-
ヘッダーファイルからの取り込...
-
4勤2休のシフト作成
-
VBからDLLへ多次元配列を渡す/...
-
ExcelVBAで質問です。離れた二...
-
CSVファイルのデータを2次元配...
-
C++ vectorに配列をプッシュしたい
-
パスカルの三角形
-
Dimとは・・・
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語 配列の長さの上限
-
配列を使わずに、変数名を動的...
-
配列で格納したものをmsgboxで...
-
C# 配列の変数宣言について。
-
先頭アドレスとは何ですか?
-
【速いブラインドタッチ】手を...
-
C# Listを使わずに2次元配列の...
-
C言語で特定列だけを抽出して配...
-
配列の参照渡しで型が一致しま...
-
【C言語】配列の中に配列を入れ...
-
unsigned char配列への入力の仕方
-
メモリの初期値
-
配列をEraseしてもメモリが開放...
-
テキストファイルから文字列を...
-
ExcelVBAで質問です。離れた二...
-
C++ vectorに配列をプッシュしたい
-
複数の選択範囲の行番号を個別...
-
VB.NET 構造体の配列の検索機能...
-
VBで構造体の配列を関数に渡す...
-
配列を含む構造体の初期値について
おすすめ情報