新しく発言する  EXIT  インデックスへ

ペントミノをプログラムで解く


  ペントミノをプログラムで解く 山中和義 2008/06/03 10:37:14 
  つづき 山中和義 2008/06/03 10:38:08 
   └つづき 山中和義 2008/06/03 10:39:53 
    └つづき(サブルーチン) 山中和義 2008/06/03 10:43:57 
Re: つづき  返事を書く  ノートメニュー
山中和義 <drdlxujciw> 2008/06/03 10:43:57
つづき(サブルーチン)
!------------------------------ ここからサブルーチン

EXTERNAL SUB display_board(M,N,board$(,)) !盤を表示する
FOR y=1 TO M
FOR x=1 TO N
PRINT board$(y,x);
NEXT x
PRINT
NEXT y
PRINT
END SUB

EXTERNAL PICTURE display_piece(i,f,shp12(,)) !片をグラフィックス表示する
LET tt=get_piece(i,f) !先頭位置
FOR q=1 TO PIECE_SIZE !正方形の数
LET x=shp12(tt+q,1)
LET y=shp12(tt+q,2)
PLOT AREA: x,y; x+1,y; x+1,y+1; x,y+1
NEXT q
END PICTURE


!技術メモ
! Lの場合
!   +0+1
!  +0L←回転の基準
!  +1L
!  +2L
!  +3LL
! 時計回りの回転(行列変換 shape*R90)
!   -3-2-1+0
!  +0LLLL
!  +1L
! 補正(平行移動)
!   +0+1+2+3
!  +0LLLL
!  +1L

EXTERNAL SUB operate_piece(shape(,),R(,)) !片を「90度回転/裏返し」させる
MAT shape=shape*R !各座標の変換

LET dx=0 !「左上詰め」への平行移動量
LET dy=0
FOR i=1 TO PIECE_SIZE !正方形の数
IF shape(i,1)<dx THEN LET dx=shape(i,1) !はみ出し量の最大を求めて
IF shape(i,2)<dy THEN LET dy=shape(i,2)
NEXT i
FOR i=1 TO PIECE_SIZE !左上に詰める
LET shape(i,1)=shape(i,1)-dx
LET shape(i,2)=shape(i,2)-dy
NEXT i
END SUB

EXTERNAL SUB set_piece(i,f,shape(,), shp12(,)) !i番の片の形状fを設定する
LET tt=get_piece(i,f) !先頭位置
FOR q=1 TO PIECE_SIZE !正方形の数
LET shp12(tt+q,1)=shape(q,1) !記録する
LET shp12(tt+q,2)=shape(q,2)
NEXT q
END SUB


EXTERNAL FUNCTION get_piece(i,f) !i番の片の形状fを得る
LET get_piece=((i-1)*8+f-1)*PIECE_SIZE !先頭位置
END FUNCTION

EXTERNAL SUB put_piece(nam$,shp,row,col, shape(,),board$(,)) !片を置く
FOR i=1 TO PIECE_SIZE !正方形の数
LET x=col+shape(shp+i,1)
LET y=row+shape(shp+i,2)
LET board$(y,x)=nam$
NEXT i
END SUB

!技術メモ
! 逆さTの場合
!  @T     T
!   T  ⇒  T
!  TTT   @TT
! 1行1列(row,col)で配置すると隙間が空くので、3行1列目へ(row2,col2)変更する

EXTERNAL SUB fit_piece(shp,row,col, row2,col2, shape(,)) !左上へと配置基準を詰める
LET tmp=999
FOR i=1 TO PIECE_SIZE !正方形の数
IF shape(shp+i,1)=0 THEN !左端の
IF shape(shp+i,2)<tmp THEN LET tmp=shape(shp+i,2) !最初の正方形の行へ
END IF
NEXT i
LET row2=row-tmp
LET col2=col
END SUB
     └つづき 山中和義 2008/06/03 10:44:52 
      ├DELETED  島村1243  2008/06/03 13:10:41  (削除)
      └DELETED  島村1243  2008/06/03 21:30:01  (削除)

 インデックスへ  EXIT
新規発言を反映させるにはブラウザの更新ボタンを押してください。