• ベストアンサー

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

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

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

  • java 多次元配列

    二次元平面を二次元配列int g[20][40]と対応させて考える。 g[x][y] == 1なら座標(x,y)に点があり、g[x][y] == 0なら点はないとする時、y = 2*x+5 (0=<x=<20)のグラフを表示するプログラムを作成せよ。 (xを縦方向,yを横方向と考えよ) というプログラムと同様にして y = x*x-8*x+16 (0=<x=<20)のグラフを表示するプログラムを作れ。という問題がプログラミング初心者の私には難しすぎます。 方法を教えて頂けないでしょうか?

  • 二次元配列について

    二次元配列が確保(?)されてなくて困っています。 プログラム内で、以下のように宣言するのですが、 #define MM 1025 //プログラム6行目 #define NN 10 //7行目 double y[MM][NN]; //17行目 y[0][0] = 3.0; //28行目 Visual Studio.NET のデバッグツールの「ウォッチ」で、 y[0][0]に代入された値を確認しようとすると、 エラー:インデックス'0'は、ポインタ/配列'y'の範囲外にあります と、表示され、中身を確認することができません。 それどころか、プログラムの後半98行目を境に、 y[0][0]の値が上書きされてしまいます。 x[k] = x[0] + k*h; //98行目 ここから、察するにメモリがちゃんと確保されていないと、 思うのですが、どうすればいいかわからず、困っています。 どなたかご教授をお願いいたします。 環境 OS : Windows XP 開発環境 : Visual Studio.NET

  • 3次元配列から2次元配列への代入

    C言語初心者です。 詳しい方、宜しくお願い致します。 下記のような三次元配列(Sanjigen[2][5][5])があります。 ダンプしたもので見難くてすみません。 00FFBCBC [0][0][0] 01 02 03 04 05 00FFBCC1 [0][1][0] 06 07 08 09 10 00FFBCC6 [0][2][0] 11 12 13 14 15 00FFBCCB [0][3][0] 16 17 18 19 20 00FFBCD0 [0][4][0] 21 22 23 24 25 00FFBCE4 [1][0][0] 26 27 28 29 30 00FFBCE9 [1][1][0] 31 32 33 34 35 00FFBCEE [1][2][0] 36 37 38 39 40 00FFBCF3 [1][3][0] 41 42 43 44 45 00FFBCF8 [1][4][0] 46 47 48 49 50 このデータ(Sanjigen[2][5][5])を、二次元配列にしまう方法をご教授ください。 Nijigen1[5][5]には三次元配列のデータ(1~25)と(26~50)をアンドしたデータを格納します。 Nijigen2[5][5]には三次元配列のデータ(1~25)と(26~50)をオアしたデータを格納します。 下記は自分の作ったプログラムですが、うまくいきません。 char Sanjigen[2][5][5]; char Nijigen1[5][5]; char Nijigen2[5][5]; void get_data( void ) { char i; for( i=0; i<8; ++i ){ Nijigen1[i] = Sanjigen[0][i] & Sanjigen[1][i]; Nijigen2[i] = Sanjigen[0][i] ^ Sanjigen[1][i]; } } 説明わかりにくくて申し訳ありません。 宜しくお願い致します。

  • java 多次元配列

    二次元平面を二次元配列int g[20][40]と対応させて考える。 g[x][y] == 1なら座標(x,y)に点があり、g[x][y] == 0なら点はないとする時、y = 2*x+5 (0=<x=<20)のグラフを表示するプログラムを作成せよ。 (xを縦方向,yを横方向と考えよ。) というプログラムと同様にして y = x*x-8*x+16 (0=<x=<20)のグラフを表示するプログラムを作れ。という問題がプログラミング初心者の私には難しすぎます。 方法を教えて頂けないでしょうか?

  • Java 配列 せん断

    急いでいます!!Java初心者のため、全くわかりません。。。 おそらく二次元配列なのですが、図形をせん断移動、回転移動させたプログラムはどのように作ればよいのでしょうか。 せん断 x'=x+by y'=y 回転 x'=x*cosθ-y*sinθ y'=x*sinθ+y*cosθ という式を教えてもらったのですがこの式を入れてもでてきません。 助けてください。。。

  • 2次元配列

    大学の課題なのですが 10×10の2次元配列に、平面のビットパターンが入っているとする(0と1の整数が入っているとする)。左右反転して出力しなさい。 という問題で、自分は以下のプログラムを作ったのですが、うまくうごいてくれません。だれか間違いを指摘していただけないでしょうか。 よろしくお願いします。 #include<stdio.h> int main(void) { int i,j; int data[10][10]={0,1}; for(i=0;i<10;i++){ for(j=0;j<10;j++){ printf("%3d",data[10-i][10-j]); } printf("\n"); } return(0); }

  • 【C言語を教えてください!】2次元配列について

    【C言語を教えてください!】2次元配列について 2次元配列を用いて、コンソール画面(ターミナル)の中央付近に*を表示させるプログラムを作りたいのですがさっぱり分かりません。 画面の大きさは半角で横80 縦25です。 25は奇数ですので40×12に表示したいと思います。 2重ループでなら出来たのですが配列でのやり方がわかりません。 #include<stdio.h> main() { int i,j; for(i=0;i<25;i++){ for(j=0;j<80;j++){ if(i==12&j==39){ putchar('*'); }else{ putchar(' '); } } } return 0; } 回答お願いします!

  • C言語、配列の積

    整数型二次元配列x,yに適当な値をキーボードから入力し、次にそれらの行列の積を計算して二次元配列zに代入し、行列x,y,zの要素を出力せよ。但し、配列の大きさは最初にキーボードから入力しておき、変数宣言においては、配列の大きさを大きめに宣言しておき、キーボードから入力する配列の大きさはその範囲内で入力するようにせよ。 という問題です。よろしくお願いいたします

  • こんばんは。数?の問題について教えてください。

    こんばんは。数?の問題について教えてください。 原点Oからの放物線y=x^2+ax+bに引いた2本の接線の接点をP,Qとする。(b>0、Pのx座標<Qのx座標) 線分PQと放物線およびy軸で囲まれた図形の面積をS1、線分PQと放物線およびy軸で囲まれた図形の面積をS2とするとき、S1とS2との比を求めよ 式まで書いていただけるとうれしいです; よろしくお願いします。

専門家に質問してみよう