要素が3個しかない(:各空白に入る候補は2つしかない)話なので,あまり深く考えずに力業で解けばよいのでは.
例えば最初の空白に着目すれば,ここに入る候補は 1
か 2
しかない.
そしたら 「よくわかんねぇけど,とりあえず 1
の側を入れてみたらどうなるのか見てやるぜ!」 っていう感じで.
その場合,こうなる↓
C
1if( a[0] <= a[1] ) //←とりあえず1を入れてみた
2{
3 if( a[2] <= a[ ] ){ //←そしたら次はここを見てみる
4 med = a[ ];
5 }
6 else
7 { /*略*/ }
8}
9else
10{ /*略*/ }
次の if を見てみると,a[2]
が a[?]
以下であれば答えが確定するという話になっている.
ここでの ?
も候補は 0
か 1
の2つしか無いのだから,両方について考えてみればいい.
0
を入れた場合:
2つの if の条件を組み合わせると a[2] <= a[0] <= a[1]
という話になる. この場合,答えは a[0]
だと言えることになるので,辻褄は合ってる.
1
を入れた場合:
「 a[1]
が最大の値だ」ということはわかるが, a[0]
と a[2]
の間の大小関係は不明だから,これだと答えを言えない.
…ということは,この流れにおいては,ここに 1
は入れられないから 0
を入れるしかない:
C
1if( a[0] <= a[1] ) //←1を入れてみた
2{
3 if( a[2] <= a[0] ){ //←0を入れることになった
4 med = a[0]; //←この場合,ここは0ってことになるね
5 }
6 else //次はこの else のところを見てみる
7 {
8 if( a[ ] <= a[2] )
9 { med = a[ ]; }
10 else
11 { med = a[2]; }
12 }
13}
14else
15{ /*略*/ }
if のところの空白を埋めた結果として, else の側に来る場合というのは,(先の2の if の条件より)「 a[0]
が最小の値である場合」ということになっている.
この場合,あとは a[1]
と a[2]
との間の大小関係さえわかれば答えを確定できるよね.
そしたらもう,この else のブロック内にある if の条件である a[?] <= a[2]
のところの ?
は 1
にするしかないよね:
C
1if( a[0] <= a[1] ) //←1を入れてみた
2{
3 if( a[2] <= a[0] ){ //←0を入れることになった
4 med = a[0]; //←この場合,ここは0ってことになる
5 }
6 else //次はこの else のところを見てみる
7 {
8 if( a[1] <= a[2] ) //←この流れではここは 1 しかないっしょ
9 { med = a[1]; } //←そしたらここは 1 になるし
10 else
11 { med = a[2]; } //←ここは 2 になるね.
12 }
13}
14else //以降,同様にこっち側もやってみればいい
15{ /*略*/ }
……と,ここまではとりあえず話の辻褄が合う形に穴を埋められている.
あとは残りも同様にやってみて,話の辻褄が合うパターンが見つかれば完了だし,そういうパターンが存在しないことがわかったならば,それはすなわち「一番最初の空白に 1
を入れることが間違いである」ということだから,最初の空白に入れるべき値は 2
に確定することができる(→以降はまた同様にやっていけばいい).
[追記]
もちろん,最初に値を仮定してみる場所というのはどこでもいい.
例えば,
「答えが { a[0]
, a[1]
, a[2]
} のどれなのかを判断するぜ!」という話をやっているのだから,
ある処理の流れの中では
med = a[0];
med = a[1];
med = a[2];
という3つの結論に処理が分岐するハズだよね.
ということは, med = a[ ];
という形の空欄の部分について考えてみれば
C
1if (a[0] <= a[ ]){
2 if (a[2] <= a[ ]){
3 med = a[ 0 ]; //←ここを 0 とするならば,
4 }else{
5 if (a[ ] <= a[2]){
6 med = a[ 1 ]; //←こっちを 1 とするということになるよね
7 }else{
8 med = a[2]; //(←これは元からある)
9 }
10 }
11}
12else
13{ /*略*/ }
という形か,あるいは
C
1if (a[0] <= a[ ]){
2 if (a[2] <= a[ ]){
3 med = a[ 1 ]; //←ここを 1 とするならば,
4 }else{
5 if (a[ ] <= a[2]){
6 med = a[ 0 ]; //←こっちを 0 とするということになるよね
7 }else{
8 med = a[2]; //(←これは元からある)
9 }
10 }
11}
12else
13{ /*略*/ }
という形のいずれかだということになる.
(→で,とりあえずどっちかに仮定してみたら条件のところの穴をまともに埋められるのか否か? というのを見ていけば良い,と.)