1
給定矩陣m
,起始位置p1
和終點p2
。 目標是計算有多少種方法可以達到最終矩陣(p2 = 1,其他= 0)。爲此,每次跳到某個位置時,都會減1。 您最多隻能在兩個位置(水平或垂直)從一個位置跳到另一個位置。例如:Haskell - 操縱列表
m = p1=(3,1) p2=(2,3)
[0 0 0]
[1 0 4]
[2 0 4]
可以跳到位置[(3,3),(2,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
我不知道如何使用array.So我無法理解您的代碼!什麼使功能'step'和'iter'?我試圖編譯你的代碼,所以我可以看到它是如何工作的,並試圖理解,但產生這樣的錯誤:'無法找到模塊'Data.Map.Strict'',當我調用任何函數'f'產生'不在範圍內'f'' – 1775
'Data.Map.Strict'是新的,你似乎安裝了'conatiners'的老版本,所以你應該使用'Data.Map','insertWith''而不是'insertWith'。 'iter'迭代一個函數'k'次(其中'k'是'iter'的第一個參數),'step'以's'步驟可達到的配置映射爲每個可達的路數,以's + 1'可達的配置的映射步驟到他們的計數。 –
謝謝,但我對理解數組有很多困難,有沒有一種方法可以使用列表列表來完成此操作?你能解釋我嗎? – 1775