2016-12-17 4 views
3

У меня есть файл в лабиринте, который вот так.Как записать направление движения SAS?

1111111 
1001111 
1101101 
1101001 
1100011 
1111111 

направления $ формата, указывающее направление

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

Затем, у меня есть набор данных, указывающие начальные и конечные точки.

Row Column 
start 2  2 
end 3  6 

Как записать направление движения от начала до конца, как это?

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

я есть использовать массив

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

однако, это просто просто не в правильном порядке, движущемся.

Спасибо, если вы можете помочь.

+0

Просьба более подробно описать, что вы пытаетесь сделать с массивом, и взглянуть на документацию для оператора массива. – user667489

+0

Приведите пример того, как должен выглядеть ваш ожидаемый результат из заданного набора входов. Непонятно, из чего вы указали то, что ищете – DCR

+0

Разве это «файл лабиринта» - лабиринт, где 1 - это стены, а 0 - подвижные пространства? (Если это так, ваш пример неразрешимый, если вы не можете двигаться по диагонали). Что бы вы хотели получить? Список путей от начала до конца? Укажите желаемый выходной набор данных. – Quentin

ответ

1

Вот один из способов сделать это. Написание более обобщенного алгоритма решения лабиринта с использованием логики шага данных SAS остается как упражнение для читателя, но это должно работать для лабиринтов.

/* 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

Спасибо, что ответили на мой вопрос. Можно ли сохранить задачу (начальную точку и конечную точку) в хеше и установить начальную точку и конечную точку, а затем выполнить цикл до тех пор, пока текущая точка не будет равна конечной точке? – Dan

+0

Да, но это кажется излишним, когда у вас всего 2 точки, и вы можете получить их непосредственно из переменных. – user667489

+0

О, это правда. Я просто хочу предотвратить жесткие коды после того, как лабиринт или задача изменится. – Dan

Смежные вопросы