与えられた行列m
、開始位置p1
と終了点p2
。目的は、最終的な行列に到達する方法がいくつあるかを計算することです(p2=1およびothers=0)。このため、ポジションにスキップするたびに、1つずつデクリメントします。ある位置から別の位置にスキップできるのは、水平または垂直の最大2つの位置だけです。例えば:
m = p1=(3,1) p2=(2,3)
[0 0 0]
[1 0 4]
[2 0 4]
あなたは位置にスキップすることができます[(3,3),(2,1)]
1つの位置からスキップすると、1つずつデクリメントして、すべてをやり直します。リストの最初の要素にスキップしましょう。このような:
m=
[0 0 0]
[1 0 4]
[1 0 4]
これで位置(3,3)
が決まり、その位置にスキップできます[(3,1),(2,3)]
そして、最終的なマトリックスまでそれを行います:
[0 0 0]
[0 0 0]
[1 0 0]
この場合、最終的な行列を取得するためのさまざまな方法の量はです20
。以下の関数を作成しました。
import Data.List
type Pos = (Int,Int)
type Matrix = [[Int]]
moviments::Pos->[Pos]
moviments (i,j)= [(i+1,j),(i+2,j),(i-1,j),(i-2,j),(i,j+1),(i,j+2),(i,j-1),(i,j-2)]
decrementsPosition:: Pos->Matrix->Matrix
decrementsPosition(1,c) (m:ms) = (decrements c m):ms
decrementsPosition(l,c) (m:ms) = m:(decrementsPosition (l-1,c) ms)
decrements:: Int->[Int]->[Int]
decrements 1 (m:ms) = (m-1):ms
decrements n (m:ms) = m:(decrements (n-1) ms)
size:: Matrix->Pos
size m = (length m,length.head $ m)
finalMatrix::Pos->Pos->Matrix
finalMatrix (m,n) p = [[if (l,c)==p then 1 else 0 | c<-[1..n]]| l<-[1..m]]
possibleMov:: Pos->Matrix->[Pos]
possibleMov p mat = checks0 ([(a,b)|a<-(dim m),b<-(dim n)] `intersect` xs) mat
where xs = movements p
(m,n) = size mat
dim:: Int->[Int]
dim 1 = [1]
dim n = n:dim (n-1)
checks0::[Pos]->Matrix->[Pos]
checks0 [] m =[]
checks0 (p:ps) m = if ((takeValue m p) == 0) then checks0 ps m
else p:checks0 ps m
takeValue:: Matrix->Pos->Int
takeValue x (i,j)= (x!!(i-1))!!(j-1)
関数の方法を作成するにはどうすればよいですか?
ways:: Pos->Pos->Matrix->Int