• 締切済み

2次元配列のマスを数える方法を教えてください!!

C++において、2次元配列の要素で上下左右に連続して塗り潰されている集まりをカウントする方法を教えてください!! 10*10の2次元配列を用意して、上下左右に連続して塗り潰されている集まりを関数の再帰処理を用いてカウントするプログラムを作りたいのですがわかりません。 問題例 ◇◆◇◇◇◆◇◆ ◆◆◇◆◇◇◇◆ ◇◇◇◆◆◆◇◆ この場合集まりは4です! 配列はstring型で多バイトの文字をカウントします。 回答お願いします!!

みんなの回答

  • chie65535
  • ベストアンサー率43% (8523/19372)
回答No.2

ループ文をコピペしてから変数名と判定式を直すの忘れた。 誤   for (y=1;y<=3;y++) {     for (x=1;y<=3;y++) { 正   for (y=1;y<=3;y++) {     for (x=1;x<=8;x++) { 実際、こういうバグは良くやる(^^;

  • chie65535
  • ベストアンサー率43% (8523/19372)
回答No.1

元よりも一回り大きいint型の2次元配列を用意して ◇◆◇◇◇◆◇◆ ◆◆◇◆◇◇◇◆ ◇◇◇◆◆◆◇◆ の各文字を数値に変換して -1,-1,-1,-1,-1,-1,-1,-1,-1,-1 -1,-1, 0,-1,-1,-1, 0,-1, 0,-1 -1, 0, 0,-1, 0,-1,-1,-1, 0,-1 -1,-1,-1,-1, 0, 0, 0,-1, 0,-1 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1 のようなデータを作る。 一回り大きくなっていて、周囲がすべて-1になっている事に注意しよう。 で、こういうデータが用意できたら「集まり番号」を「0」に初期化しておく。 次に、配列の[1][1]~[1][8]、[2][1]~[2][8]、[3][1]~[3][8]の順でスキャンしていく。 void main(void) {   int 集まり番号=0;   int y,x;   文字列をintの二次元配列に変換する関数();   for (y=1;y<=3;y++) {     for (x=1;y<=3;y++) {       if ( ! 二次元配列[yの位置][xの位置]) {         trace(y,x,++集まり番号);       }     }   }   printf("集まりの個数は%d個です\n",集まり番号); } 最初に[1][2]の所(以下の★に相当する所)で、配列要素が0になっているのを見つけたら、集まり番号をインクリメントしてから、追跡ルーチンを呼び出す。 ◇★◇◇◇◆◇◆ ◆◆◇◆◇◇◇◆ ◇◇◇◆◆◆◇◆ 追跡ルーチンは void trace(int yの位置,int xの位置,int 集まり番号) {   if ( ! 二次元配列[yの位置][xの位置]) {     trace(int yの位置-1,int xの位置,int 集まり番号);     trace(int yの位置+1,int xの位置,int 集まり番号);     trace(int yの位置,int xの位置-1,int 集まり番号);     trace(int yの位置,int xの位置+1,int 集まり番号);     二次元配列[yの位置][xの位置] = 集まり番号;   } } って感じ。 メインルーチンの二重ループが終了した時点で、二次元配列の中身は -1,-1,-1,-1,-1,-1,-1,-1,-1,-1 -1,-1, 1,-1,-1,-1, 2,-1, 3,-1 -1, 1, 1,-1, 4,-1,-1,-1, 3,-1 -1,-1,-1,-1, 4, 4, 4,-1, 3,-1 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1 と言う状態になっている筈です。

関連するQ&A

  • 2次元配列のマスを数える方法を教えてください!!

    C++において、2次元配列の要素で上下左右に連続して塗り潰されている集まりをカウントする方法を教えてください!! 10*10の2次元配列を用意して、上下左右に連続して塗り潰されている集まりを関数の再帰処理を用いてカウントするプログラムを作りたいのですがわかりません。 問題例 ◇◆◇◇◇◆◇◆ ◆◆◇◆◇◇◇◆ ◇◇◇◆◆◆◇◆ この場合集まりは4です! 配列はstring型で多バイトの文字をカウントします。 回答お願いします!!

  • 要素にnullが入った多次元配列の次元数(2回目)

    同様の質問について再度投稿します。 以下、問題集で見掛けたプログラムの抜粋です。 String[][] Array = { {"Sunday", "Monday"}, null, {"Monday", "Tuesday"} }; int count =0; for (String[] A : array){ count += A.length; } System.out.println(count); このプログラムを実行すると、 要素nullのlengthが数えられないため、 NullPointerExceptionが発生する、ということです。 以前に質問した際には、 上記配列に含まれるnullは、大カッコで囲まれていないため、 次元としてカウントされないので、配列の次元数は 2次元となる、という回答を頂きました。 (配列変数も二次元で宣言されている。) 細かいようですが、大カッコで囲まれていないnullは 次元数としてカウントされなくても、要素として 拡張for文の対象にはなるのでしょうか…? 解説をお願いします。

  • 多次元の配列を[ ]で括って見やすくトレースするには?

    多次元の配列を[ ]で括って見やすくトレースするには? 何次元か特定される配列ならばforなどで次元の数だけ繰り返せばできるとは思うのですが そうでないときにも [ [ [a,b,c,...],[],[],...],[],[],... ] のように隣り合う要素(配列)との切れ目が見やすいようにトレースする方法はありますか? プログラムには影響しませんが、トレースすると1次元の配列と同じように , だけで区切られてトレースされてしまい見にくいですので 配列が何次元か返させる関数など書ければ良いと思うのですが FlashPlayer10、ActionScript3.0です 質問の意味理解していただけるでしょうか お願いします

    • ベストアンサー
    • Flash
  • 多次元配列のカウントのしかた

    すみません、質問させてください。 $array1:1次元配列 $array2:2次元配列 1次元配列のカウント(要素数)をしるには count($array1) とすれば取得することができますが、 2次元配列のカウントを取得するにはどのように すればいいのでしょうか?そんな関数はありますか? $array2のデータの中身 $array[0][0] = 'a'; $array[0][1] = 'b'; $array[1][0] = 'c'; $array[1][1] = 'd'; $array[2][0] = 'e'; $array[2][1] = 'f'; この場合、3という値が欲しいのですが・・・ 宜しくお願い致します。

    • ベストアンサー
    • PHP
  • 2次元配列を多次元配列にする。

    2次元配列を多次元配列にする。 PHP5で 2次元目はすべて同じキーの2次元配列を 2次元目のキーごとの内容を共通項にまとめて、 多次元配列にする方法を教えてください。 キーの数は膨大なので、関数の再帰呼び出し で、きれいに処理したいのです。 説明文では説明しきれないので、 やりたいことは↓の通りです。 array[0] = array([one] => "あ", [twe] => "う" [three] => "き"); array[1] = array([one] => "あ", [twe] => "う" [three] => "く"); array[2] = array([one] => "あ", [twe] => "え" [three] => "け"); array[3] = array([one] => "あ", [twe] => "え" [three] => "こ"); array[4] = array([one] => "い", [twe] => "お" [three] => "さ"); array[5] = array([one] => "い", [twe] => "お" [three] => "し"); array[6] = array([one] => "い", [twe] => "か" [three] => "す"); array[7] = array([one] => "い", [twe] => "か" [three] => "せ"); という配列があったら、これを↓のようにしたいです。 array( [あ] => array( [う] => array ("き", "く") [え] => array ("け", "こ") ) [い] => array( [お] => array ("さ", "し") [か] => array ("す", "せ") )   ) どうぞよろしくお願いいたします。

    • ベストアンサー
    • PHP
  • Java:要素にnullが入った多次元配列の次元数

    次のプログラムを見かけて質問します。 String[][] Array = { {"Sunday", "Monday"}, null, {"Monday", "Tuesday"} }; イコールの左を見ると二次元配列に見えますが、右を見ると三次元配列に見えます。 nullは要素として数えられないのでしょうか。 その場合、それは何故なのか教えてもらえますか? よろしくお願いします。

    • ベストアンサー
    • Java
  • 二次元配列が、勝手に一次元配列になってしまう

    Excelのマクロで、二次元配列を格納したバリアント型を戻り値とする関数を作ったのですが、… 二次元型配列のひとつの要素数が1の時、受け取ったバリアント型変数は、一次元配列になっています。 列ベクトルなら、それもありかな~と思うのですが、なんで、行ベクトルまで、一次元配列にするんだよ~って、困っています。 シートから関数を呼んだ場合は、列ベクトルは列ベクトル、行ベクトルは行ベクトルとして、表示されるので、マクロの中で関数を呼び出した場合も、行列の情報を保持できる方法があるんじゃないかと思ったのですが。 どなたか、ご教示頂けるとありがたいです。 よろしくお願いします。

  • 2次元配列

    2次元配列は宣言して生成しますが配列名が異なる配列を例えば100個用意するにはいちいち宣言していたらすごいプログラム量になるので何かいい方法はないでしょうか?付け足しで指定した個数(例えば100個)分名前の異なる2次元配列を生成するには? java初心者なのでサンプルプログラムがあるとありがたいです。よろしくお願いします。

  • 多次元配列を、1次元の配列にする関数を書いてください。

    以下のように、多次元配列の配列をペチャンコにする関数(array_flatten)ってどうかきますか? <?php $arr[0] = 'a'; $arr[1][0] = 'b'; $arr[1][1][0] = 'c'; $arr[1][1][1][0] = 'd'; $arr[1][1][1][1][0] = 'e'; $arr[1][1][1][2] = 'f'; $arr[1][1][2] = 'g'; $arr[1][2] = 'h'; $arr[2] = 'i'; function array_flatten($arg){   処理; } $new_arr = array_flatten($arr); print_r($new_arr); ?> ↓ Array (   [0] => a   [1] => b   [2] => c   [3] => d   [4] => e   [5] => f   [6] => g   [7] => h   [8] => i ) ※関数のなかで、ペチャンコの配列を格納するための新しい配列を宣言すると、 同関数を再帰的に呼び出したら、その配列が初期化されますよね?

    • ベストアンサー
    • PHP
  • 多次元配列なんですが・・・

    初心者です。多次元配列をつかって縦の一列目と横の一列目だけに要素を表示さてたいのですが、どのようなプログラムを組んだらいいのでしょうか。友達に「triMatrix」というのを使ったらどうかといわれたのですが、いまいち分かりませんどなたか助言をお願いします。

専門家に質問してみよう