Haskell - Manipulieren von Listen [geschlossen]

Eine Matrix gegebenmeine Ausgangspositionp1 und ein letzter Punktp2. Das Ziel ist zu berechnen, wie viele Wege es gibt, um die endgültige Matrix zu erreichen (p2 = 1 und andere = 0). Zu diesem Zweck wird jedes Mal, wenn Sie eine Position anfahren, um eins verringert. Sie können nur um höchstens zwei Positionen (horizontal oder vertikal) von einer Position zur nächsten springen. Zum Beispiel:

   m =             p1=(3,1)  p2=(2,3)
   [0 0 0]
   [1 0 4]
   [2 0 4]

Sie können zu den Positionen springen[(3,3),(2,1)]

Wenn Sie von einer Position aus überspringen, dekrementieren Sie sie um eins und erledigen alles erneut. Lassen Sie uns zum ersten Element der Liste springen. So was:

    m=              
    [0 0 0]
    [1 0 4]
    [1 0 4]

Jetzt bist du in Position(3,3) und Sie können zu den Positionen springen[(3,1),(2,3)]

Und das bis zur endgültigen Matrix:

[0 0 0]
[0 0 0]
[1 0 0]

In diesem Fall gibt es verschiedene Möglichkeiten, um die endgültige Matrix zu erhalten20. Ich habe die folgenden Funktionen erstellt:

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)

Irgendeine Idee, wie ich Funktionsweisen erstelle?

 ways:: Pos->Pos->Matrix->Int  

Antworten auf die Frage(1)

Ihre Antwort auf die Frage