2016-12-17 25 views
3

Ich habe eine Labyrinth-Datei, die so ist.Wie zeichnet man die Bewegungsrichtung SAS auf?

1111111 
1001111 
1101101 
1101001 
1100011 
1111111 

ein Format Richtung $

start end label 
D  D down 
L  L left 
R  R right 
U  U up 

dann die Richtung angibt, habe ich einen Datensatz den Start- und Endpunkt angibt.

Row Column 
start 2  2 
end 3  6 

Wie kann ich die Bewegungsrichtung vom Anfang bis zum Ende so aufzeichnen?

direction row column 
      2 2 
right  2 3 
down  3 3  
down  4 3 
down  5 3 

ich habe Verwendung Array

array m(i,j) 
if m(i,j) = 0 then 
row=i; 
column=j; 
output; 

es jedoch einfach nur nicht in der richtigen Reihenfolge bewegt.

Danke, wenn Sie helfen können.

+0

Bitte beschreiben Sie genauer, was Sie mit dem Array zu tun versuchen, und sehen Sie sich die Dokumentation für die Array-Anweisung an. – user667489

+0

geben Sie ein Beispiel dafür, wie Ihre erwartete Ausgabe von einer gegebenen Menge von Eingaben aussehen sollte. Es ist nicht klar aus dem, was Sie zur Verfügung gestellt, was Sie suchen – DCR

+0

Ist das "Labyrinth-Datei" ein Labyrinth, wo die 1 sind Wände und die 0 sind bewegliche Räume? (Wenn dies der Fall ist, ist Ihr Beispiel nicht lösbar, es sei denn, Sie können sich diagonal bewegen). Was möchten Sie als Ausgabe? Eine Liste des Pfades von Anfang bis Ende? Bitte zeigen Sie das gewünschte Ausgabe-Dataset an. – Quentin

Antwort

1

Hier ist eine Möglichkeit, dies zu tun. Das Schreiben eines verallgemeinerten Labyrinthlösungsalgorithmus unter Verwendung der SAS-Datenschrittlogik wird als eine Übung für den Leser belassen, aber dies sollte für Labyrinthe funktionieren.

/* Define the format */ 

proc format; 
value $direction 
'D' = 'down' 
'L' = 'left' 
'R' = 'right' 
'U' = 'up' 
; 
run; 


data want; 

/*Read in the maze and start/end points in (y,x) orientation*/ 
array maze(6,7) (
1,1,1,1,1,1,1, 
1,0,0,1,1,1,1, 
1,1,0,1,1,0,1, 
1,1,0,1,0,0,1, 
1,1,0,0,0,1,1, 
1,1,1,1,1,1,1 
); 
array endpoints (2,2) (
2,2 
3,6 
); 
/*Load the start point and output a row*/ 
x = endpoints(1,2); 
y = endpoints(1,1); 
output; 

/* 
Navigate through the maze. 
Assume for the sake of simplicity that it is really more of a labyrinth, 
i.e. there is only ever one valid direction in which to move, 
other than the direction you just came from, 
and that the end point is reachable 
*/ 
do _n_ = 1 by 1 until(x = endpoints(2,2) and y = endpoints(2,1)); 
    if maze(y-1,x) = 0 and direction ne 'D' then do; 
     direction = 'U'; 
     y + -1; 
    end; 
    else if maze(y+1,x) = 0 and direction ne 'U' then do; 
     direction = 'D'; 
     y + 1; 
    end; 
    else if maze(y,x-1) = 0 and direction ne 'R' then do; 
     direction = 'L'; 
     x + -1; 
    end;  
    else if maze(y,x+1) = 0 and direction ne 'L' then do; 
     direction = 'R'; 
     x + 1; 
    end;    
    output; 
    if _n_ > 15 then stop; /*Set a step limit in case something goes wrong*/ 
end; 
format direction $direction.; 
drop maze: endpoints:; 
run; 
+0

Danke für die Beantwortung meiner Frage. Ist es möglich, die Aufgabe (Startpunkt und Endpunkt) im Hash zu speichern und den Start- und Endpunkt festzulegen und dann zu wiederholen, bis der aktuelle Punkt gleich dem Endpunkt ist? – Dan

+0

Ja, aber das scheint übertrieben zu sein, wenn du nur 2 Punkte hast und du kannst sie direkt von Variablen bekommen. – user667489

+0

Oh, das stimmt. Ich möchte nur die Hardcodes verhindern, sobald sich das Labyrinth oder die Aufgabe geändert haben. – Dan

Verwandte Themen