このトピック では: mxn テーブルでパスを見つける方法 2 つのポイント間のパスを生成する方法を見つけました。これがコードです。
go m n (i,j) =
[ (i+1,j) | i<m ] ++
[ (i-1,j) | i>1 ] ++
[ (i,j+1) | j<n ] ++
[ (i,j-1) | j>1 ]
-- isEndOfPath p q = (p == q)
genPath p q acc m n input buf = g p q acc buf where
g p q acc buf | p==q = [(acc)] -- return acc, buf
g p q acc buf = [s
| r <- go m n q, notElem r buf, notElem r acc,
notElem r input,
s <- genPath p r (r:acc) m n input (r:buf)] ++
[s
| r <- go m n q, notElem r acc,
r==p,
s <- genPath p r (r:acc) m n input (r:buf)]
たとえば、2x2 上の (2,2) から (1,1) へのパスを検索できます。したがって、次のように呼び出すことができます
genPath (2,2) (1,1) [(1,1)] 2 2 [(3,3),(1,1)] [(1,1)]
結果が得られました
[[(2,2),(2,1),(1,1)],[(2,2),(2,1),(1,1)],[(2,2),(1,2),(1,1)],[(2,2),(1,2),(1,1)]]
したがって、正しいパスがあります。
そして今、ポイントのペア間のすべてのパスを見つけます。Prolog では非常に簡単で、問題はありませんでした。だから、多分私はあなたに私のアルゴリズムとコードを示します:
最初の述語 - すべてのパスが見つかったら、それを返します。
genAllPaths([],A,A,_,_,_,_).
そうでなければ、パスを再帰的に生成する必要があります。したがって、まず最初のペア間のパスを見つけてから、他のパスを検索できます。
genAllPaths([(I1,J1),(I2,J2)|T],Acc,S,M,N,Input,Bufor) :-
genPath((I1,J1),(I2,J2),[(I2,J2)],X,M,N,Input,[(I2,J2)|Bufor],NewBufor),
genAllPaths(T,[X|Acc],S,M,N,Input,NewBufor).
何かわからないことがあれば、私に聞いてください。
したがって、今は haskell でそれを行います。試してみましたが、やはり問題がたくさんあります。あなたがそれを行う方法を知っていて、私を助けたいなら-私は非常に感謝します.