このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/tech/1276873238/529
# 
# [問題]
# 始点、終点の座標と、途中にある円の中心座標、半径が与えられる。
# 始点から終点に移動するとき、円周の線をまたがなければならない回数の最小回数を求めよ。
# ただし、円同士の円周・始点・終点は接触しないものとする。
# 

'始点、終点の座標と、途中にある円の中心座標、半径が与えられる。始点から終点に移動するとき、円周の線をまたがなければならない回数の最小回数を求めよ。ただし、円同士の円周・始点・終点は接触しないものとする。'(_X座標ならび,_Y座標ならび,_半径ならび,_始点X,_始点Y,_終点X,_終点Y,_最小回数) :-
        最小回数(_X座標ならび,_Y座標ならび,_半径ならび,_始点X,_始点Y,_終点X,_終点Y,_最小回数).

最小回数([],[],[],_始点X,_始点Y,_終点X,_終点Y,0) :- !.
最小回数([_中心X|R1],[_中心Y|R2],[_半径|R3],_始点X,_始点Y,_終点X,_終点Y,_最小回数) :-
        円周の線をまたがなければならない(_中心X,_中心Y,_始点X,_始点Y,_終点X,_終点Y,_半径),
        最小回数(R1,R2,R3,_始点X,_始点Y,_終点X,_終点Y,_最小回数_1),
        _最小回数 is _最小回数_1 + 1.

円周の線をまたがなければならない(_中心X,_中心Y,_始点X,_始点Y,_終点X,_終点Y,_半径) :-
        始点または終点が中心からの円の内側にある(_中心X,_中心Y,_始点X,_始点Y,_半径),!.
円周の線をまたがなければならない(_中心X,_中心Y,_始点X,_始点Y,_終点X,_終点Y,_半径) :-
        始点または終点が中心からの円の内側にある(_中心X,_中心Y,_終点X,_終点Y,_半径),!.

始点または終点が中心からの円の内側にある(X1,Y1,X2,Y2,_半径) :-
        (X1 - X2) * (X1 - X2) + (Y1 - Y2) * (Y1 - Y2) =< (_半径 * _半径).