このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/tech/1296387672/122
#  [1] 授業単元:アルゴリズム 
#  [2] 問題文(含コード&リンク):http://ime.nu/www.dotup.org/uploda/www.dotup.org1311028.txt.html 
#  
#  Map.datを読み取って画面に一覧表を表示「1」と「.」は半角
#  県と県の間を半角開ける
#  
#  1.北海道 2.青森県・・・47.沖縄県を表示
#  一行につき6県
#  
#  (例)
#  _1.北海道____2.鹿児島県__3.
#        
#  ↑
#  桁が上がったとき用
#  
#  
#  43.□□□___44.□□
#  
#  
#  次に47都道府県のうち出発地と目的地の入力を要求する.
#  
#  「出発の県を入力してください」
#  「目的の県を入力してください」
#  
#  
#  
#  
#  次に結果を表示.
#  
#  ・距離と経路を出力
#  
#  経路
#  □□□□→□□□□→・・・→□□□□
#  
#                        -10byte--
#  
#  経路は7県まで
#  
#  
#  
#  とする
#  
#  
#  
#  map.datの中身は↓です
#  
#  北海道,青森県,岩手県,宮城県,秋田県,山形県,福島県,茨城県,栃木県,群馬県,埼玉県,千葉県,東京都,神奈川県,新潟県,富山県,石川県,福井県,山梨県,長野県,岐阜県,静岡県,愛知県,三重県,滋賀県,京都府,大阪府,兵庫県,奈良県,和歌山県,鳥取県,島根県,岡山県,広島県,山口県,徳島県,香川県,愛媛県,高知県,福岡県,佐賀県,長崎県,熊本県,大分県,宮崎県,鹿児島県,沖縄県
#  
#  北海道,0,426,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
#  
#  青森県,426,0,187,-1,190,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
#  
#  岩手県,-1,187,0,193,108,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
#  
#  宮城県,-1,-1,193,0,258,72,84,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
#  
#  秋田県,-1,190,108,258,0,212,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
#  
#  山形県,-1,-1,-1,72,212,0,102,-1,-1,-1,-1,-1,-1,-1,169,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
#  
#  福島県,-1,-1,-1,84,-1,102,0,203,172,275,-1,-1,-1,-1,189,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
#  
#  茨城県,-1,-1,-1,-1,-1,-1,203,0,76,-1,-1,116,128,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
#  
#  栃木県,-1,-1,-1,-1,-1,-1,172,76,0,109,100,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
#  
#  群馬県,-1,-1,-1,-1,-1,275,-1,109,0,103,-1,-1,-1,220,-1,-1,-1,-1,151,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
#  
#  埼玉県,-1,-1,-1,-1,-1,-1,116,100,103,0,69,24,-1,-1,-1,-1,-1,157,215,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
#  
#  千葉県,-1,-1,-1,-1,-1,-1,128,-1,-1,69,0,50,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
#  
#  東京都,-1,-1,-1,-1,-1,-1,-1,-1,-1,24,50,0,37,-1,-1,-1,-1,133,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
#  
#  神奈川県,-1,-1,-1,-1,-1,-1,-1,-1,-1,37,0,-1,-1,-1,-1,134,-1,-1,240,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
#  
#  新潟県,-1,-1,-1,-1,169,189,-1,-1,220,-1,-1,-1,-1,0,250,-1,-1,-1,208,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
#  
#  富山県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,250,0,61,-1,-1,196,294,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
#  
#  石川県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,61,0,83,-1,-1,235,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
#  
#  福井県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,83,0,-1,-1,160,-1,-1,-1,176,188,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
#  
#  山梨県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,164,-1,126,134,-1,-1,-1,-1,0,162,-1,109,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
#  
#  長野県,-1,-1,-1,-1,-1,-1,-1,-1,-1,151,220,-1,-1,-1,208,196,-1,-1,162,0,295,271,272,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
#  
#  岐阜県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,294,235,160,-1,295,0,-1,43,113,128,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
#  
#  静岡県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,167,-1,-1,-1,-1,109,271,-1,0,181,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
#  
#  愛知県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,272,43,181,0,82,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
#  
#  三重県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,113,-1,82,0,95,107,-1,-1,91,91,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
#  
#  滋賀県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,176,-1,-1,128,-1,-1,95,0,14,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
#  
#  京都府,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,188,-1,-1,-1,-1,-1,107,14,0,49,75,48,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
#  
#  大阪府,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,49,0,45,33,80,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
#  
#  兵庫県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,75,45,0,-1,-1,180,-1,139,-1,-1,115,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
#  
#  奈良県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,91,-1,48,33,-1,0,98,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
#  
#  和歌山県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,91,-1,-1,-1,-1,98,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
#  
#  鳥取県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,180,-1,-1,0,128,167,296,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
#  島根県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,80,-1,128,0,-1,212,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
#  
#  岡山県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,139,-1,-1,167,-1,0,165,-1,-1,70,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
#  
#  広島県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,296,212,165,0,131,-1,-1,190,-1,-1,-1,-1,-1,-1,-1,-1,-1
#  
#  山口県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,131,0,250,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
#  
#  徳島県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,115,-1,-1,-1,-1,-1,-1,250,0,73,191,161,-1,-1,-1,-1,-1,-1,-1,-1
#  
#  香川県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,70,-1,-1,73,0,156,-1,-1,-1,-1,-1,-1,-1,-1,-1
#  
#  愛媛県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,190,-1,191,156,0,156,-1,-1,-1,-1,-1,-1,-1,-1
#  
#  高知県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,161,-1,156,0,-1,-1,-1,-1,-1,-1,-1,-1
#  
#  福岡県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,165,-1,-1,-1,-1,0,61,-1,117,159,-1,-1,-1
#  
#  佐賀県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,61,0,109,-1,-1,-1,-1,-1
#  
#  長崎県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,109,0,-1,-1,-1,-1,-1
#  
#  熊本県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,117,-1,-1,0,218,192,187,-1
#  
#  大分県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,159,-1,-1,218,0,181,-1,-1
#  
#  宮崎県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,192,181,0,158,-1
#  
#  鹿児島県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,187,-1,158,0,733
#  
#  沖縄県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,733,0
#  

'47都道府県のうち出発地と目的地の入力して最短経路を求めて距離と順路を表示する(ただし経路は7以下とする)' :-
        'Map.datを読み取って画面に一覧表を表示「1」と「.」は半角 県と県の間を半角 開ける'(_都道府県名ならび),

        '47都道府県のうち出発地と目的地の入力する'(_都道府県名ならび,_出発地,_目的地),
        最短経路(_出発地,_目的地,_距離,_順路),
        距離と経路の表示(_出発地,_目的地,_距離,_順路).

'47都道府県のうち出発地と目的地の入力する'(_都道府県名ならび,_出発地,_目的地) :-
        出発地を入力する(_都道府県名ならび,_出発地),
        目的地を入力する(_都道府県名ならび,_目的地).

出発地を入力する(_都道府県名ならび,_出発地) :-
        write('出発地の都道府県名番号を入力してください : '),
        get_line(Line),
        出発地を入力診断(Line,_都道府県名ならび,_出発地),!.
出発地を入力する(_都道府県名ならび,_出発地) :-
        出発地を入力する(_都道府県名ならび,_出発地).

出発地を入力診断(Line,_都道府県名ならび,_出発地) :-
        atom_to_term(Line,_出発地番号,_),
        integer(_出発地番号),
        _出発地番号 > 1,
        _出発地番号 =< 47,
        list_nth(_出発地番号,_都道府県名ならび,_出発地),!.
出発地を入力診断(Line,_都道府県名ならび,_出発地) :-
        write_formatted('入力された %t から適切な出発地を得ることができません。再入力をお願いします。\n',[Line]),
        fail.

目的地を入力する(_都道府県名ならび,_目的地) :-
        write('目的地の都道府県名番号を入力してください : '),
        get_line(Line),
        目的地を入力診断(Line,_都道府県名ならび,_目的地),
目的地を入力する(_都道府県名ならび,_目的地) :-
        目的地を入力する(_都道府県名ならび,_目的地).

目的地を入力診断(Line,_都道府県名ならび,_目的地) :-
        atom_to_term(Line,_目的地番号,_),
        integer(_目的地番号),
        _目的地番号 > 1,
        _目的地番号 =< 47,!.
目的地を入力診断(Line,_,_目的地) :-
        write_formatted('入力された %t から適切な目的地を得ることができません。再入力をお願いします。\n',[Line]),
        fail.
距離と経路の表示(_出発地,_目的地,_距離,_順路) :-
        write_formatted('距離は %t,経路は %t',[_距離,_出発地]),
        append(_,[[A,B]|R],_順路),
        write_formatted(' -> %t ',[B]),
        R = [],
        write('\n'),!.

'Map.datを読み取って画面に一覧表を表示「1」と「.」は半角 県と県の間を半角 開ける'(_都道府県名ならび) :-
        get_split_lines('Map.dat',[','],LL),
        第要素は都道府県名、残りは経路情報(LL,_都道府県名ならび,_経路情報ならび),
        append(L0,[[_県名|_隣接情報ならび]|R2],_経路情報ならび),
        隣接情報の登録(_県名,_都道府県名ならび,_隣接情報ならび),
        length([_|L0],_都道府県番号),
        write('%2d.%t ',[_都道府県番号,_県名]),
        R2 = [],
        write('\n').

第一要素は都道府県名、残りは経路情報(LL,_都道府県名ならび,_経路情報ならび) :-
        LL = [_都道府県名ならび|_経路情報ならび],!.

隣接情報の登録(_都道府県名,_都道府県名ならび,L1) :-
        abolish(隣接県距離/3),
        append(L0,[_距離|R],L1),
        \+(_距離 = (-1)),
        \+(_距離 = 0),
        length([_|L0],Nth),
        list_nth(Nth,_都道府県名ならび,_都道府県名2),
        assertz(隣接県距離(_都道府県名,_件名2,_距離)),
        fail.
隣接情報の登録(_,_,_).

最短経路(_出発地,_目的地,_距離,_順路) :-
        findall([_順路,_距離],(
                    到達(_出発地,_目的地,_距離,[],_順路)),
                _順路・距離ならび),
        findmin(_距離,append(_,[[_,_距離]|_],_順路・距離ならび),_最短距離),
        append(_,[[_順路,_最短距離]|_],_順路距離ならび).

到達(_都道府県名1,_都道府県名2,_距離,_順路1,_順路) :-
        隣接県距離(_都道府県名1,_都道府県名2,_距離),
        append(_順路1,[[_都道府県名1,_都道府県名2]],_順路),!.
到達(_都道府県名1,_都道府県名2,_距離,_順路1,_順路) :-
        length(_順路1,_経路数),
        _経路数 < 7,
        隣接県距離(_都道府県名1,_都道府県名3,_距離1),
        この経路は選択されたことがない(_都道府県名1,_都道府県名2),
        append(_順路1,[[_都道府県名1,_都道府県名3]],_順路2),
        到達(_都道府県名1,_都道府県名2,_距離2,_順路2,_順路),
        _距離 is _距離1 + _距離2.

この経路は選択されたことがない(_都道府県名1,_都道府県名2) :-
        \+(append(_,[[_都道府県名1,_都道府県名3]|_],_順路1)),
        \+(append(_,[[_都道府県名3,_都道府県名1]|_],_順路1)),!.