HOME»基本情報技術者試験掲示板»平成29年春期 午後問8 で躓きました
投稿する
»[1302] 俺の目がおかしいのかな? 投稿数:3
»[1301] 10年考えても解けない問題があります 投稿数:2
平成29年春期 午後問8 で躓きました [1304]
sadaさん(No.1)
タイトルの通りなのですが、自分の間違いに気づけないのでアドバイスを頂きたいです。
プログラム23行目についてですが
j:i+1 ,j<nPoint ,1
となっていますが
これは、ループのjがi+1(つまり初回のjは1)から始まるということですよね?
j:i ,j<nPoint ,1
こう(初回のjは0)でなければつじつまが合わないようにおもうのですが
考え方が間違っているでしょうか。
プログラム23行目についてですが
j:i+1 ,j<nPoint ,1
となっていますが
これは、ループのjがi+1(つまり初回のjは1)から始まるということですよね?
j:i ,j<nPoint ,1
こう(初回のjは0)でなければつじつまが合わないようにおもうのですが
考え方が間違っているでしょうか。
2018.08.12 01:22
阿南市長さん(No.2)
問題文中に書いてある内容のうち、該当部分を理解するための起債としては以下のことが当てはまります。
「(4):行番号11では,出発地から出発地自体への最短距離 pDist[sp] に0を設定する。」とあることと、
(5)中の以下の文章
「 行番号23~29 出発地からの最短距離が未確定の地点の中で,出発地からの距離が最も短い地点を探し,その地点を sPoint とし,その地点の最短距離を確定する。」
この二つを踏まえると、少しわかりやすくなると思います。
該当部分を含めた12行目~39行目までが一つの大きなループで、その中にさらに小さなループが仕込まれている多重ループ構造になっています。jに代入するiの初期値も、おおもとのループの一番最初に設定されていて、それが23行目からのループにも影響します。
大外のループの最初に、iに0を代入しています。これは出発地tとして0が代入されています。(13行目)
上の二つの文章から、
「出発地0→0は最短距離が0で確定している」
「最短距離が未確定の地点だけループに入るように制御する」ことが分かれば、
j : i(最初の段階では0が入っている) はこの条件に合致しないと解釈できる、という流れになります。
移動先 j = 0 と、出発地 i = 0の最短距離は0で既に確定している、という風に読み変えると理解しやすいと思います。
「(4):行番号11では,出発地から出発地自体への最短距離 pDist[sp] に0を設定する。」とあることと、
(5)中の以下の文章
「 行番号23~29 出発地からの最短距離が未確定の地点の中で,出発地からの距離が最も短い地点を探し,その地点を sPoint とし,その地点の最短距離を確定する。」
この二つを踏まえると、少しわかりやすくなると思います。
該当部分を含めた12行目~39行目までが一つの大きなループで、その中にさらに小さなループが仕込まれている多重ループ構造になっています。jに代入するiの初期値も、おおもとのループの一番最初に設定されていて、それが23行目からのループにも影響します。
大外のループの最初に、iに0を代入しています。これは出発地tとして0が代入されています。(13行目)
上の二つの文章から、
「出発地0→0は最短距離が0で確定している」
「最短距離が未確定の地点だけループに入るように制御する」ことが分かれば、
j : i(最初の段階では0が入っている) はこの条件に合致しないと解釈できる、という流れになります。
移動先 j = 0 と、出発地 i = 0の最短距離は0で既に確定している、という風に読み変えると理解しやすいと思います。
2018.08.12 04:10
sadaさん(No.3)
返信ありがとうございます。
トレースしたところ阿南市長のおっしゃることが理解できました。
自分は下記の解説を見て、ループ変jの値は0から始まると
勘違いししまったのですが、解説は正しいでしょうか。
「[ a ]が含まれるループでは、ループ変数jを0から地点数-1まで増やしながら~」
トレースしたところ阿南市長のおっしゃることが理解できました。
自分は下記の解説を見て、ループ変jの値は0から始まると
勘違いししまったのですが、解説は正しいでしょうか。
「[ a ]が含まれるループでは、ループ変数jを0から地点数-1まで増やしながら~」
2018.08.12 09:54
阿南市長さん(No.4)
ループの開始条件としては
「[ a ]が含まれるループでは、ループ変数jを0から地点数-1まで増やしながら~」は間違っていません。
ただ、i も j も配列の先頭(0)からループをスタートすることになると、「出発地0→0は最短距離が0で確定している」という前提条件により結果として無駄な処理をすることになるので、j は i + 1 から始めておけば最初の無駄になりうる処理を省略できる、という形を踏むことが多い印象ですね。
この問題に限らず、同じ配列でかつそれぞれで違う要素を比較する場合には、 ループ中でi と j の初期値を一つずらしてから比較するといったことはよく行われます。
「[ a ]が含まれるループでは、ループ変数jを0から地点数-1まで増やしながら~」は間違っていません。
ただ、i も j も配列の先頭(0)からループをスタートすることになると、「出発地0→0は最短距離が0で確定している」という前提条件により結果として無駄な処理をすることになるので、j は i + 1 から始めておけば最初の無駄になりうる処理を省略できる、という形を踏むことが多い印象ですね。
この問題に限らず、同じ配列でかつそれぞれで違う要素を比較する場合には、 ループ中でi と j の初期値を一つずらしてから比較するといったことはよく行われます。
2018.08.12 16:10
sadaさん(No.5)
解説もこれで正しいのですね。
正直申し上げると解説については釈然としない部分もありますが
肝心の処理については納得できました。
ありがとうございました。
正直申し上げると解説については釈然としない部分もありますが
肝心の処理については納得できました。
ありがとうございました。
2018.08.12 20:28
その他のスレッド
»[1303] Fソフトウェア設計、ネットワーク、企業と法務の午後 投稿数:1»[1302] 俺の目がおかしいのかな? 投稿数:3
»[1301] 10年考えても解けない問題があります 投稿数:2