富士五湖.TVへ | 小説のページへ | その他コンピュータの目次へ |
そのプログラム手法の解法 |
Kubo 1995-2017
社員研修の最後に課題として出題したプログラムの思考方法をJAVAに書き改めました。
本プログラムの利点は解法に至る思考方法とプログラム技法を試すことである。
※再帰を使用するのかリスト構造にするのかは修学程度で決めればよい。
プログラムは単純である。
1. コインが移動するのに十分な空間(配列を)用意。
coinBase Class
2. 完成条件「コインの間が空かないで交互になる」まで再帰で総当たりをする。
isAlternate()
完成条件。
run( int n ) 再帰。nは再起の深さ。
3. 移動できるコインを探す。
つまり「隣り合うコインは空間以外」が移動可能なコイン。
isGet( int n )
nは調べる最初の配列番号。
4. 移動場所を探す。条件1「置ける場所は空間」である。
isPutNull( int n ) nは調べる最初の配列番号。
5. 移動場所を探す。条件2「置ける場所はコインに隣接」する。
isPutTouch( int n ) nは調べる最初の配列番号。
実行結果
・Windows10 core-i7 3.4GHz 32Mem
・n=3~n=5 処理時間は6ms、13ms、330ms
・n=6 処理時間は23945ms システム上、解法の表示は下から上へとなる。
..............OXOXOXOXOXOX..........
............XOOXOXOXOXO..X..........
............XOOXOXOX..OOXX..........
............XOO..XOXXOOOXX..........
............XOOXXXO..OOOXX..........
............X..XXXOOOOOOXX..........
............XXXXXXOOOOOO............
・n=7 処理時間は3427066ms
................OXOXOXOXOXOXOX............
..............XOOXOXOXOXOXO..X............
..............XOOXOX..OXOXOOXX............
..............XOOXOXXOO..XOOXX............
..............XOOX..XOOOXXOOXX............
..............XOOXXXXOOO..OOXX............
..............X..XXXXOOOOOOOXX............
..............XXXXXXXOOOOOOO..............
・3枚 ●●●〇〇〇 ・・●〇〇〇●● ・・●〇〇・・●〇● ・・・・〇●〇●〇● or ・・・・●●●〇〇〇 ・・〇〇●●●〇・・ 〇●〇・・●●〇・・ 〇●〇●〇●・・・・ 3枚は特別? |
・4枚 ●●●●〇〇〇〇 ●・・●〇〇〇〇●● ●〇〇●・・〇〇●● ●〇〇●〇●〇・・● ・・〇●〇●〇●〇● ・5枚 ●●●●●〇〇〇〇〇 ●・・●●〇〇〇〇〇●● ●〇〇●●〇〇・・〇●● ●〇〇●・・〇●〇〇●● ●〇〇●〇●〇●〇・・● ・・〇●〇●〇●〇●〇● ・6枚 ●●●●●●〇〇〇〇〇〇 ●・・●●●〇〇〇〇〇〇●● ●〇〇●●●〇・・〇〇〇●● ●〇〇・・●〇●●〇〇〇●● ●〇〇●〇●〇●・・〇〇●● ●〇〇●〇●〇●〇●〇・・● ・・〇●〇●〇●〇●〇●〇● ・7枚 ●●●●●●●〇〇〇〇〇〇〇 ●・・●●●●〇〇〇〇〇〇〇●● ●〇〇●●●●〇〇〇・・〇〇●● ●〇〇●・・●〇〇〇●●〇〇●● ●〇〇●〇●●〇〇・・●〇〇●● ●〇〇●〇●・・〇●〇●〇〇●● ●〇〇●〇●〇●〇●〇●〇・・● ・・〇●〇●〇●〇●〇●〇●〇● |
先のプログラムでコンピュータによる7枚の実行結果は約57分であった。
当たり前だが、本アルゴリズムでの検証は以降指数的に時間がかかる。
ただし、過去に10枚までプログラムで検証済みで、10枚の時は10回で交互にできる。
従って、ここまで(7枚)の結果を踏まえて8枚以降を推測する。
・8枚を面パターンから推測してみる。
1. パターン表から以下の部分はパターンで推測できる
●●●●●●●●〇〇〇〇〇〇〇〇
●・・●●●●●〇〇〇〇〇〇〇〇●●
●〇〇●??????????〇〇●●
●〇〇???????????〇〇●●
●〇〇???????????〇〇●●
●〇〇???????????〇〇●●
●〇〇●〇●〇●〇●〇●〇●〇・・●
・・〇●〇●〇●〇●〇●〇●〇●〇●
2. もう少しパターンを見つける
●●●●●●●●〇〇〇〇〇〇〇〇
●・・●●●●●〇〇〇〇〇〇〇〇●●
●〇〇●●●●●〇?????〇〇●●
●〇〇?〇??●〇?????〇〇●●
●〇〇●〇●?●〇?????〇〇●●
●〇〇●〇●?●〇?????〇〇●●
●〇〇●〇●〇●〇●〇●〇●〇・・●
・・〇●〇●〇●〇●〇●〇●〇●〇●
3. 以降、どの手順でパターンを当てはめれば解が得られるか?
また、別のアプローチがあるか検証する。
●●●〇〇〇 ・・●〇〇〇●● ・・●〇〇・・●〇● ・・・・〇●〇●〇● ●●●●●〇〇〇〇〇 ●・・●●〇〇〇〇〇●● ●〇〇●●〇〇・・〇●● ●〇〇●・・〇●〇〇●● ●〇〇●〇●〇●〇・・● ・・〇●〇●〇●〇●〇● ●●●●●●●〇〇〇〇〇〇〇 ●・・●●●●〇〇〇〇〇〇〇●● ●〇〇●●●●〇〇〇・・〇〇●● ●〇〇●・・●〇〇〇●●〇〇●● ●〇〇●〇●●〇〇・・●〇〇●● ●〇〇●〇●・・〇●〇●〇〇●● ●〇〇●〇●〇●〇●〇●〇・・● ・・〇●〇●〇●〇●〇●〇●〇● ●●●●●●●●●〇〇〇〇〇〇〇〇〇 ●・・●●●●●●〇〇〇〇〇〇〇〇〇●● ●〇〇●●●●●●〇〇・・〇〇〇〇〇●● ●〇〇●・・●●●〇〇●●〇〇〇〇〇●● ●〇〇●〇〇●●●〇〇●●〇〇・・〇●● ●〇〇●〇〇●●・・〇●●〇〇●〇〇●● ●〇〇●〇・・●〇●〇●●〇〇●〇〇●● ●〇〇●〇●〇●〇●〇●・・〇●〇〇●● ●〇〇●〇●〇●〇●〇●〇●〇●〇・・● ・・〇●〇●〇●〇●〇●〇●〇●〇●〇● |
●●●●〇〇〇〇 ●・・●〇〇〇〇●● ●〇〇●・・〇〇●● ●〇〇●〇●〇・・● ・・〇●〇●〇●〇● ●●●●●●〇〇〇〇〇〇 ●・・●●●〇〇〇〇〇〇●● ●〇〇●●●〇・・〇〇〇●● ●〇〇・・●〇●●〇〇〇●● ●〇〇●〇●〇●・・〇〇●● ●〇〇●〇●〇●〇●〇・・● ・・〇●〇●〇●〇●〇●〇● ●●●●●●●●〇〇〇〇〇〇〇〇 ●・・●●●●●〇〇〇〇〇〇〇〇●● ●〇〇●●●●●〇・・〇〇〇〇〇●● ●〇〇●・・●●〇●●〇〇〇〇〇●● ●〇〇●〇〇●●〇●●〇・・〇〇●● ●〇〇●〇・・●〇●●〇〇●〇〇●● ●〇〇●〇●〇●〇●・・〇●〇〇●● ●〇〇●〇●〇●〇●〇●〇●〇・・● ・・〇●〇●〇●〇●〇●〇●〇●〇● ●●●●●●●●●●〇〇〇〇〇〇〇〇〇〇 ●・・●●●●●●●〇〇〇〇〇〇〇〇〇〇●● ●〇〇●●●●●●●〇・・〇〇〇〇〇〇〇●● ●〇〇●・・●●●●〇●●〇〇〇〇〇〇〇●● ●〇〇●〇〇●●●●〇●●〇〇・・〇〇〇●● ●〇〇●〇〇●・・●〇●●〇〇●●〇〇〇●● ●〇〇●〇〇●●〇●〇●・・〇●●〇〇〇●● ●〇〇●〇・・●〇●〇●〇●〇●●〇〇〇●● ●〇〇●〇●〇●〇●〇●〇●〇●・・〇〇●● ●〇〇●〇●〇●〇●〇●〇●〇●〇●〇・・● ・・〇●〇●〇●〇●〇●〇●〇●〇●〇●〇● |
|