このディレクトリの索引

# [1] 授業単元:情報処理 # [2] 問題文(含コード&リンク): # 例えば下図に示すように,通行可能なマス目に'0'が, # 障害物があって通行不能なマス目に'+'が記されている盤がある. # 盤の左上をスタート地点,右下をゴール地点として,経路を表示する # プログラムを作りなさい. # 盤の例 # 0 0 + 0 + # + 0 0 0 + # 0 + + 0 0 # 0 0 + 0 0 # + 0 0 0 0 # # 例えばこのようなアルゴリズムが考えられる. # # 1) 現在位置を表示の後、進行方向に対して,右に進めるなら右に, # そうでなければ直進,それもだめなら左に,さらにそれもダメなら後退する. # 2) 1を繰り返してゴールに達したらその旨を表示する. # ただし,マス目の数分だけ移動してもゴールに達しない場合はその時点で終了する. # # 入力形式は、 # # %> ./a.out 00+0+ +000+ 0++00 00+00 +0000 # # とする. '例えば下図に示すように,通行可能なマス目に'0'が, 障害物があって通行不能なマス目に'+'が記されている盤がある. 盤の左上をスタート地点,右下をゴール地点として,経路を表示する プログラムを作りなさい. 盤の例 0 0 + 0 + + 0 0 0 + 0 + + 0 0 0 0 + 0 0 + 0 0 0 0 例えばこのようなアルゴリズムが考えられる. 1) 現在位置を表示の後、進行方向に対して,右に進めるなら右に, そうでなければ直進,それもだめなら左に,さらにそれもダメなら後退する. 2) 1を繰り返してゴールに達したらその旨を表示する. ただし,マス目の数分だけ移動してもゴールに達しない場合はその時点で終了する. 入力形式は、 %> ./a.out 00+0+ +000+ 0++00 00+00 +0000 とする.'(X) :- abolish(経路/2), 経路盤を描く(X). 経路探索((1,1),_終点,[(1,1)],X). 経路盤を描く(X) :- write('盤面を一行で入力しなさい '), 行入力(_行), 経路盤を描く(_行,_終点). 経路探索(_終点,_終点,Log,Log) :- !. 経路探索(A,_終点,Log,X) :- 経路(A,B), \+(member(B,Log)), 経路探索(B,_終点,[B|Log],X),!. 経路探索(A,_終点,Log,X) :- 経路(B,A), \+(member(B,Log)), 経路探索(B,_終点,[B|Log],X),!. 経路盤を描く(_行,(N,M)) :- 項目区切り(_行,[' '],L), findall(L1,(member(A,L),atom_chars(A,L1)),Ls), length(Ls,N), t340_2(1,Ls), 行列の転置(Ls,Ls2), length(Ls2,M), t340_3(1,Ls2),!. t340_2(_,[]) :- !. t340_2(N,[L|R]) :- t340_2_1(N,1,L), N2 is N + 1, t340_2(N2,R). t340_2_1(_,_,[_]) :- !. t340_2_1(N,M,['+'|R]) :- M2 is M + 1, t340_2_1(N,M2,R),!. t340_2_1(N,M,[A,B|R]) :- not(A='+'), not(B='+'), M2 is M + 1, assertz(経路((N,M),(N,M2))), t340_2_1(N,M2,[B|R]),!. t340_2_1(N,M,[A,B|R]) :- not(A='+'), B='+', M2 is M + 1, t340_2_1(N,M2,[B|R]),!. t340_3_1(_,_,[_]) :- !. t340_3_1(N,M,['+'|R]) :- M2 is M + 1, t340_3_1(N,M2,R),!. t340_3_1(N,M,[A,B|R]) :- not(A='+'), not(B='+'), M2 is M + 1, assertz(経路((M,N),(M2,N))), t340_3_1(N,M2,[B|R]),!. t340_3_1(N,M,[A,B|R]) :- not(A='+'), B='+', M2 is M + 1, t340_3_1(N,M2,[B|R]),!. 行入力(_行) :- read_line_to_codes(current_input,_コードならび), atom_codes(_行,_コードならび). 項目区切り(_文字列,_区切り文字列ならび,_区切られた文字列ならび) :- 先頭から区切り文字列で区切って行く(_文字列,_区切り文字列ならび,_区切られた文字列ならび),!. 項目区切り(_文字列,_,[_文字列]). 先頭から区切り文字列で区切って行く(_文字列,_区切り文字列ならび,[_前文字列|R]) :- '区切り文字列で前文字列、後文字列に区切る'(_文字列,_区切り文字列ならび,_前文字列,_区切り文字列,_後文字列), 項目区切り(_後文字列,_区切り文字列ならび,R). '区切り文字列で前文字列、後文字列に区切る'(_文字列,_区切り文字列ならび,_前文字列,_区切り文字列,_後文字列) :- 副文字列(_文字列,_前文字列,_区切り文字列,_後文字列), member(_区切り文字列,_区切り文字列ならび). 副文字列(_文字列,_前文字列,_副文字列,_後文字列) :- atom_concat(_前文字列,_残り文字列,_文字列), atom_concat(_副文字列,_後文字列,_残り文字列). 文字列ならびの中で数値に変換可能なものは変換する(_文字列ならび,_項目ならび) :- findall(_項目,( 文字列を取り出し数値に変換可能なものは変換する(_文字列ならび,_項目)),_項目ならび). 文字列を取り出し数値に変換可能なものは変換する(_文字列ならび,_項目) :- member(_文字列,_文字列ならび), 数値に変換可能なものは変換する(_文字列,_項目). 数値に変換可能なものは変換する(_文字列,_項目) :- atom_number(_文字列,_項目),!. 数値に変換可能なものは変換する(_文字列,_文字列).