- 締切済み
複雑なプログラムの作成で行き詰っています。
このようなプログラムを書いています ---------------------------------------------------- (1) 10×10の二次元配列を全て 0 で埋める。 (2) 乱数で選んだ1つの要素を 1 にする。 (3) 配列の 1 の要素の中から1つの要素を乱数で選ぶ。 (4) (3)で選んだ 1 の要素を起点にして、 隣接する 0 の要素の中から、 5方向が 0 (下図で説明)に囲まれた 0 の要素を乱数で選ぶ。 選んだ要素を 1 に変更し、その要素に移動。 このように 0 の領域に向けて 1 の領域を拡張していく。 (5) 拡張できる隣接する 0 の要素が無い場合、(3) に戻る。 ---------------------------------------------------- 配列において [ 0 ][ 0 ][ 0 ] [ 0 ][ * ][ 0 ] [ow][ 1 ][ow] [ow][ 1 ][ow] [ 0 ][ * ][ 0 ] [ 0 ][ 0 ][ 0 ] [ow][ 0 ][ 0 ] [ 1 ][ * ][ 0 ] [ow][ 0 ][ 0 ] [ 0 ][ 0 ][ow] [ 0 ][ * ][ 1 ] [ 0 ][ 0 ][ow] この4種類のみ、乱数で選択したいです。 0:0の要素 1:1の要素 *:前述(4)の「1を起点とした隣接する」0の要素の位置 ow:otherwize(0でも1でもいい要素) 図 5方向の0についての説明 絵を描きながらイメージして書いているのですが プログラムの経験が浅く、どう作ればいいかわかりません。 配列や動作の構造をできるだけ簡単に記述したいです。 実際にC言語で作っていただけたら大変助かります。 よろしくお願いします。
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- kmetu
- ベストアンサー率41% (562/1346)
> (4) (3)で選んだ 1 の要素を起点にして、 隣接する 0 の要素の中から、 5方向が 0 (下図で説明)に囲まれた 0 の要素を乱数で選ぶ。 元の場所m[a][b]として 乱数を0から3まで発生させて移動方向を仮に決める (0 右 1 左 2 上 3 下 等決めておく) 移動先が左右の場合 m[-a][b] m[+a][b] 移動先が上下の場合 m[a][-b] m[a][-b] で0の要素の数を調べる αとする 仮に決めた移動先を m[x][y] とすれば m[x-1][y-1] m[x][y-1] m[x+1][y-1] m[x-1][y] m[x+1][y] m[x+1][y+1] m[x][y+1] m[x+1][y+1] で0の要素を数を調べて先に調べたαを引いて5になればそこに移動する という動きで(無駄な調査が入りますが)いけそうだと思われます。
- Tacosan
- ベストアンサー率23% (3656/15482)
「プログラムの経験が浅い」というなら, 「配列や動作の構造をできるだけ簡単に記述したい」とかいう夢は脇においておいてやりたいことをベタに書いてみては?