A地点からB地点へ

 投稿者:山中和義  投稿日:2015年 5月 8日(金)10時44分3秒
  左上がA地点、右下がB地点とする。

交差点の形状
 0       1       2       3
  ×   │   ×   │
 ×・  ×・  ─・  ─・
として、
各交差点での経路のマップをつくる。


 A─・─・
 │ │ │
 ・ ・─・
 │ │ │
 ・─・─B
の場合、
 0,2,2
 1,1,3
 1,3,3
となる。
交差点の個数は、縦3個、横3個となる。



DATA 8,5 !縦横の大きさ(交差点の数)
DATA 0,2,2,0,0 !マップ
DATA 1,3,3,2,0
DATA 1,3,3,3,2
DATA 0,1,3,3,3
DATA 0,0,1,3,3
DATA 0,0,0,1,3
DATA 0,0,0,0,1
DATA 0,0,0,0,1

READ M,N !縦横
SET WINDOW -1,MAX(M,N),-1,MAX(M,N)
DRAW grid
DIM P(0 TO N-1) !点(x,y)を通過する場合の数
MAT P=ZER
FOR Y=M-1 TO 0 STEP -1 !左上から右下へ
   FOR X=0 TO N-1
      READ R !交差点の形状
      SELECT CASE R
      CASE 0
         IF X=0 AND Y=M-1 THEN !始点Aなら
            LET P(X)=1
         ELSE
            LET P(X)=0
         END IF
      CASE 1
         PLOT LINES: X,Y+1; X,Y
      CASE 2
         LET P(X)=P(X-1)
         PLOT LINES: X-1,Y; X,Y
      CASE 3
         IF X=0 THEN !左端
            IF Y=M-1 THEN LET P(X)=1 !始点Aとつながっている
         ELSE
            LET P(X)=P(X)+P(X-1) !累計 ※パスカルの三角形
         END IF
         PLOT LINES: X,Y+1; X,Y !縦の経路
         PLOT LINES: X-1,Y; X,Y !横の経路
      END SELECT
      IF P(X)>0 OR R>0 THEN
         DRAW disk WITH SCALE(0.1)*SHIFT(X,Y)
         PLOT TEXT ,AT X+0.1,Y+0.1: STR$(P(X))
      END IF
   NEXT X
NEXT Y
PRINT P(N-1);"通り"
END




DATA 5,6 !例1
DATA 0,2,2,2,0,0
DATA 1,3,3,3,0,0
DATA 1,3,3,3,2,2
DATA 1,3,3,3,3,3
DATA 0,0,1,3,3,3



DATA 5,6 !例2
DATA 0,2,2,2,2,2
DATA 1,3,3,3,3,3
DATA 1,3,0,0,1,3
DATA 1,3,2,2,3,3
DATA 1,3,3,3,3,3



DATA 5,5 !例3
DATA 0,2,0,0,0
DATA 1,3,2,0,0
DATA 1,3,3,2,0
DATA 1,3,3,3,2
DATA 1,3,3,3,3



 

戻る