平成30年春期午後問3 設問3

マイムさん  
(No.1)
問題文中の〔盤面の表現の変更〕に、「盤面をナイトが移動できるマスが全て含まれる範囲まで拡大して表現する」とありますが、この表現の意味が分かりません。
本件に関し、
①「ナイトが移動できるマスが全て含まれる範囲」の意味を具体的に教えて頂けますでしょうか?(理解力がないような質問で申し訳ございません)
②M=4, N=3以外の例を出していただけますでしょうか?

恐れ入りますが、よろしくお願い致します。
2023.08.05 16:30
まーぼさん 
(No.2)
この投稿は投稿者により削除されました。(2023.08.05 17:12)
2023.08.05 17:12
まーぼさん 
(No.3)
この投稿は投稿者により削除されました。(2023.08.05 17:16)
2023.08.05 17:16
まーぼさん 
(No.4)
>①「ナイトが移動できるマスが全て含まれる範囲」の意味を具体的に教えて頂けますでしょうか?(理解力がないような質問で申し訳ございません)

図6の変更後の行3列3にナイトがあるとき、行1列2に移動できますよね。ここから行1列2は含む範囲にしないと行けません。ということで上に2行増やします。
上下ひっくり返しても同じことが言えるので、ひっくり返した後の上にも2行増やします。(変更後の図から見て下2行)

行3列3のナイトは行2列1にも移動できるため、行2列1も含む範囲にするため左に2列増やします。先ほどと同様に考えると右にも2列増やさないと行けません。

>②M=4, N=3以外の例を出していただけますでしょうか?

上下に2行ずつ、左右に2列ずつ増やして増やした分には1が入るような図になると思います。
2023.08.05 17:16
マイムさん  
(No.5)
まーぼ様
ご回答ありがとうございます。

①についてですが、変更後の盤面で行1列1, 行1列7, 行8列1, 行8列7をの初期値を0ではなく、1にする理由ですが、単に図6にそのように記載されているのと、2次元配列boardを扱いやすくするため、と思っても差し支えないのでしょうか?
(やはり、感覚で捉える必要があるのですかね…)

また、追加で申し訳ございませんが、以下についてもご回答頂けるとありがたいです。

解答とは直接は関係ありませんが、
printFlagの値が0から1に変更されるのはsearch関数内なので、プログラムの実行結果は解答の有無に関わらず、「解答がありません。」と表示されると思ったのですが、いかがでしょうか?
解説内のJavaScriptのソースコード上はprintFlagがグローバル変数として定義されていますが、問題文ではprintFlagがグローバル変数として定義されている旨が特に記載されていなかったので、気になりました。

以上、よろしくお願い致します。
2023.08.06 08:57
まーぼさん 
(No.6)
>①についてですが、変更後の盤面で行1列1, 行1列7, 行8列1, 行8列7をの初期値を0ではなく、1にする理由ですが、単に図6にそのように記載されているのと、2次元配列boardを扱いやすくするため、と思っても差し支えないのでしょうか?

初期値を1にするのは、盤面外つまり移動できないことを表すためです。行1列1などは移動できない場所なので0で初期化しない方がいいかと思います。

>printFlagの値が0から1に変更されるのはsearch関数内なので、プログラムの実行結果は解答の有無に関わらず、「解答がありません。」と表示されると思ったのですが、いかがでしょうか?

こちらは私もよく分かりませんでした。察しろということなのでしょうか。分かる方お願いします。
2023.08.06 10:44
jjon-comさん 
AP プラチナマイスター
(No.7)
応用情報技術者過去問題 平成30年春期 午後問3
https://www.ap-siken.com/kakomon/30_haru/pm03.html

問題文にこう書いてありますから、

> 〔盤面の表現の変更〕
> ナイトの移動先が盤面の範囲外となった場合の
> 判定処理を簡略化するために,図6のように盤面を
> ナイトが移動できるマスが全て含まれる範囲まで拡大して表現する。

「図6 変更前の盤面」を、
> 盤面をナイトが移動できるマスが全て含まれる範囲まで拡大
したのが「図6 変更後の盤面」です。

----
問題文にこう書いてあります。

> 再帰関数 search(移動順序,行,列)
> i. 行と列で指定されるマス(以下,現在のマスという)が
> 盤面の範囲外,又は既に通過したマスであった場合,
> 何もせずに再帰関数 search の呼出し元へ戻る。

盤面の範囲外ではない? を判定するために次のコードがあり、
2: if (vが1以上、かつ、n以下)
3:   if (hが1以上、かつ、n以下)

既に通過したマスではない? を判定するために次のコードがあります。
4:     if (board[v][h]が0)

以上のように「図6 変更前の盤面」の場合はこのコーディングになります。

それに対して「図6 変更後の盤面」を採用した場合は、
本来の盤面の周囲にナイトが移動できるマス(配列要素)が存在していますから、
2: if (vが1以上、かつ、n以下)
3:   if (hが1以上、かつ、n以下)
というコードを削除しても、添字が配列の範囲外を指す例外(Javaで言うArrayIndexOutOfBoundsException)が発生しません。
4:     if (board[v][h]が0)
とだけ判定すればいいので、
> ナイトの移動先が盤面の範囲外となった場合の判定処理を簡略化
できます。

> 変更後の盤面で(略)の初期値を0ではなく、1にする理由
は、0でない値であればどんな数値でもプログラムは正常動作します。

----
> 問題文ではprintFlagがグローバル変数として定義されている旨が
> 特に記載されていなかったので、気になりました。

IPA(独立行政法人 情報処理推進機構)が公開している
「試験で使用する情報技術に関する用語・プログラム言語など」
には、変数の有効範囲(スコープ)に関する規定はなかったはずです。
特記されていなければグローバル変数だと捉えることになるでしょう。
2023.08.06 17:36
マイムさん  
(No.8)
まーぼ様
jjon-com様
ご丁寧にご説明ありがとうございます。
盤面の表現やprintrFlagについて、非常によく分かりました。
やはり察しろということになるんですね…

疑問点は解決致しました。
ありがとうございました!
2023.08.07 22:13

返信投稿用フォーム

スパム防止のためにスレッド作成日から30日経過したスレッドへの書込みはできません。

その他のスレッド


Pagetop