研究帖21


作者へのメッセージ
研究課題 女王様の慰安旅行

研究課題 女王様の慰安旅行

 

 

そよ風さん「博士!、聞いて下さい!」

ナイス博士「やあ、そよ風さん、どうしたんだい?」

そよ風さん「それが、BB君に会ったんです!」

ナイス博士「何だって!いつだい?」

そよ風さん「昨日、私のハノイの塔の感想を聞きに、オーナーに会いに行ったら、ビルの前で ぼんやり立っているので、こっそり背後から近づいておどかしてやったんです!」

ナイス博士「そういう事をするもんじゃないよ。それで?」

そよ風さん「あっけに取られて、『そよ風さん......』って言ったっきり一言もいわないで じっと見ているんで、今までの事やブラック博士の事だとか、全部話したんです。」

ナイス博士「そうか。で?」

そよ風さん「今度また遊びに行くって言ってました。用事が有っていそがしくて行けなかった んだって言ってました。」

ナイス博士「そうか。じゃ、もう怒ってないんだな?」

そよ風さん「ええ、そのことを言っても最初は何の事か忘れていて、『ああ、その事か、 全然気にしてないよ。』って言ってました。」

ナイス博士「そうか。それは良かった。」

 

 

 

ナイス博士「それで、オーナーはハノイの塔の事を、何か言ってたかい?」

そよ風さん「ええ、私が行く前にちょうどブラック博士が来ていたそうです。プログラムを 見せたら、博士はびっくりしてたそうです。」

ナイス博士「そうか!」

そよ風さん「それなのに、まだいろんな事をごちゃごちゃ言うんで、『それなら君が作って 見なさい!!』って一喝したら、すごすごと帰って行ったそうです!!」

ナイス博士「そうか!そいつは愉快だ!ワッハッハッ!ついでに、もう来るな!!って 行ってやれば良かったんだ!!」

そよ風さん「いや、そこまでは言わなかったそうです。でも、」

ナイス博士「でも、何だい?」

そよ風さん「彼に仕事を頼んだそうです。」

ナイス博士なっ、なんだって!!

 

 

 

ナイス博士「いったい、どんな仕事を頼んだんだ?」

そよ風さん「オーナーは、今度女王様たちを、熱海の温泉に慰安旅行に連れて行くそうです。」

ナイス博士「そうか。たまには、そういうのも良いな。」

そよ風さん「ええ、8人ががんばったおかげで、ずいぶん儲かったそうですから、それぐらい 当然だって言ってました。」

ナイス博士「で、それとブラック博士の仕事と関係が有るのかい?」

そよ風さん「ええ、温泉で卓球大会をやるんですが、総当りでシングルスやダブルスの 試合をやると、どういう組み合わせにしたら良いのか、パソコンで計算してくれって頼んだそうです。」

ナイス博士「そんな事か。わざわざプログラムするほどの事でもないのになあ。」

そよ風さん「ええ、で、ブラック博士はその仕事を、100万円で請け負ったそうです。」

ナイス博士「何!ひゃっ、100万円だって!」

 

 

 

ナイス博士「それは、あまりにも高すぎるぞ!とんでもない奴だ!」

そよ風さん「ええ、でも、見積書や仕様書を持ち出して、ごちゃごちゃ理屈を言って、 100万円で受注したそうです。」

ナイス博士「何でだ!私たちはせいぜいニシンの干物しかもらえないじゃないか。」

そよ風さん「ええ、でも、博士は本当はサラリーマンだし、アルバイトは禁止なんでしょう?」

ナイス博士「そうだな、やむをえないんだが、それにしても100万円とは...... そうだ!いい事を考えた!!

そよ風さん「どっ、どうしたんですか急に。また何か、くだらない事を考えついたんですか?」

ナイス博士「何を言っている!!このチャンスに、ブラック博士をやっつけるんだ!!」

そよ風さん「ええっ、どうするんですか?」

ナイス博士「あいつはいつも、私たちのプログラムを誹謗中傷するじゃないか! 今度は、私たちが先に、もっとすごいプログラムをオーナーに作って見せて、奴に100万円も払うのを 阻止してやるんだ!!」

そよ風さん「おおっ!それはすごい!!早速やりましょう!」

 

 

 

そよ風さん「どうやって作るんですか?」

ナイス博士「君は、” さーんぽすーすんーでにーほさーがるーー♪♪”って歌を知ってるかい?」

そよ風さん「知りませんけど、下手な歌ですね。」

ナイス博士「うるさい!そんなことはどうでも良いんだ。これは、人生とは常に、 前進し、失敗したら少し戻ってさらに前進し、その地道な繰り返しで、やがては幸運をつかめると言う、 素晴らしい歌なんだ。これをプログラムに応用出来るんだ。」

そよ風さん「へえっ、そんな方法が有るんですか?」

ナイス博士「うん、バックトラック法だ!!」

そよ風さん「なるほど!バックトラックでグットラックですね!!」

ナイス博士「うまい事言うね。」

 

 

 

*******************************************************************************************

【8人から、ダブルスに出る4人の組み合わせを、バックトラック法で全部出すプログラムの計画】

 

1.4つの要素の配列{0,1,2,3}を作って表示する。

2.最後の要素を1つずつ増やしながら表示する。

{0,1,2,4} {0,1,2,5} {0,1,2,6} {0,1,2,7}

3.最後が7になったら1つ前の要素を1つ増やし、最後の要素をそれより1つ大きい数にして続ける。

{0,1,3,4} {0,1,3,5} {0,1,3,6} {0,1,3,7}

4.ここまでを繰り返し、1つ前の要素が6になったら、{0,1,6,7}さらにその前の要素を1つ 増やし、後の数を1つ大きい数にして、{0,2,3,4}同じ要領で続ける。

5.最初の要素が4になったら、表示し、それ以下の要素がないので終わり。{4,5,6,7}

 

*これを、引数をうまく使って、同じメソッドを再帰で繰り返し使って実現する。

*******************************************************************************************

 

ナイス博士「こんな感じだ。」

そよ風さん「どんなコードにするんですか?」

ナイス博士「ちょっと待ってくれ。....カチャカチャ、ポン,クルクル、ポン,出来たぞ!」

****************************************************************

void setArray(int index){
        if(start){
            arrayOutput();  //配列出力のメソッド。最初の配列を出力。
            start=false;
        }
        
        if(index<0)return;  //配列のインデックスが0以下になったら終わる。
        if(ar[index]<end-(ar.length-(index+1))){  //要素がさらに増やせる場合
            ar[index]++;                 //値を1つ増やす。
            if(index<(ar.length-1)){         //さらに、最後の要素でない場合
                for(int i=index;i<ar.length-1;i++){ // 後ろの値を1つずつ増やす。
                    ar[i+1]=ar[i]+1;
                }  
            }
            
            arrayOutput();
            setArray(ar.length-1);           //最後の要素で続ける。      
        }
        else setArray(index-1);//要素がその最大値を越えたなら1つ前の要素で続ける。
        return;
    }
}

*****************************************************************

そよ風さん「かなりややこしいコードですね。」

ナイス博士「うん。アプレットでも動くよ。」

 

アプレット

AppletStart.javaのコード CombinationArray.javaのコード

 簡単なクラス図

 

 

そよ風さん「ちょっと!博士、これじゃだめですよ!!また、ブラック博士に 『数字の羅列じゃないか、ワッハッハッハッ』って笑われますよ!!」

ナイス博士「フッフッフッ....よく見なさい。この数字は何だと思う?」

そよ風さん「ええっ?{0,1,2,4}.. {0,1,2,5}... {0,1,2,6}.. ああっ!これは!!

 

続く。

 

」」」」」」」」」」」」」」」」」」」」」」」」」」」」」」」」」」」」」」」」」」」

作者へのメッセージ

 

研究課題に戻る。

 見学者への注意事項に戻る。