課題の質問

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ragnarok

課題の質問

#1

投稿記事 by ragnarok » 18年前

課題でこのような問題が出たのですが、途中までしか分からなくて・・・

[ まず,3×3の全マス目の初期状態を1~6の並び番号付きでコンソールに表示する.
次に,キーボードからシフト回数を入力する.
入力された回数だけ,シフト処理を繰り返し実行する.


(1) 1~6の並びのうちの1つをランダムに選び,その並びのシフト方向(-1 または +1)をランダムに決定する.
(2) 上記(ⅰ)の並びに対し,決定した方向のシフト操作でのシャッフルを実行する.
(3) シフトされた結果を表示する.なお,選択された並び番号及びシフト方向も併せて表示する.

(4) キーボードより1~6の並び番号,及び-1または+1のシフト方向を入力.
(5) 指定された並びに対し,指定された方向のシフト操作を実行する.
(6) シフトによるシャッフル結果を表示する.
(7)もし行方向,あるいは列方向に3つの並びとも同じ数字が揃っていれば祝福のメッセージを表示して終了する.そうでなければ(4)へ戻る


<実行例>

シフト回数は?2 ← キーボードから2と入力

1 2 3
[1][1][1] 4
[2][2][2] 5
[3][3][3] 6


<1回目> 3を-1動かす
1 2 3
[1][1][2] 4
[2][2][3] 5
[3][3][1] 6


<2回目> 5を1動かす
1 2 3
[1][1][2] 4
[3][2][2] 5
[3][3][1] 6

(1)~(3)の動作がここまで

(4)~(7)の動作はここから

どの並びを動かしますか?(1~6) 5 ← キーボードから5と入力
どう動かしますか? (-1 or 1) -1 ← キーボードから-1と入力

1 2 3
[1][1][2] 4
[2][2][3] 5
[3][3][1] 6


どの並びを動かしますか?(1~6) 3 ← キーボードから3と入力
どう動かしますか? (-1 or 1) 1 ← キーボードから1と入力

1 2 3
[1][1][1] 4
[2][2][2] 5
[3][3][3] 6

Congratulations !! ]

(3)までのプログラムはできてるんですが、(4)からの処理がお手上げ状態で・・・
よろしくお願いします。
<!--2-->

バグ

Re:課題の質問

#2

投稿記事 by バグ » 18年前

ここまで出来ていたら、すぐだと思いますよ。

>>(4) キーボードより1~6の並び番号,及び-1または+1のシフト方向を入力.

これはとりあえずscanf関数でいいでしょう。


>>(5) 指定された並びに対し,指定された方向のシフト操作を実行する.
>>(6) シフトによるシャッフル結果を表示する.

実際にシャッフルする動作はrotate_vとrotate_h関数がそのまま再利用できますよね?


>>(7)もし行方向,あるいは列方向に3つの並びとも同じ数字が揃っていれば祝福のメッセージを表示して終了する.そうでなければ(4)へ戻る

これはif文でいいですよね。
data[0][0] , data[1][0] , data[2][0]
data[0][1] , data[1][1] , data[2][1]
data[0][2] , data[1][2] , data[2][2]
例えば、上図のように並んでいるとすると…
// 最上段の判定
if (data[0][0] == data[1][0] && data[0][0] == data[2][0])

// 最左列の判定
if (data[0][0] == data[0][1] && data[0][0] == data[0][2])
こんな感じです。
繰り返し処理は(4)~(7)をwhileで囲ってやり、(7)の判定が真の場合にbreakでループから抜けてやればいいだけですね。頑張って!!(^-^)

閉鎖

“C言語何でも質問掲示板” へ戻る