つづき
LET M=8 !行 ※盤の大きさ LET N=8 !列 DIM board$(M,N) !盤 FOR yy=1 TO M !盤の初期化 FOR xx=1 TO N LET board$(yy,xx)="." !空き NEXT xx NEXT yy LET board$(4,4)=" " !ピリオド以外の文字 LET board$(5,4)=" " LET board$(4,5)=" " LET board$(5,5)=" " CALL display_board(M,N,board$) !---------------------------------------- PUBLIC NUMERIC ANSWER_COUNT !解答数 LET ANSWER_COUNT=0 LET a=MAX(M,N) SET WINDOW 0,a+2,a+2,0 !表示領域 DIM R90(2,2) !90度回転 90 DATA 0,-1 !(cosθ -sinθ) DATA 1, 0 !(sinθ cosθ) RESTORE 90 MAT READ R90 DIM REV(2,2) !裏返す ※Y軸対称 95 DATA -1,0 !scale DATA 0,1 RESTORE 95 MAT READ REV !技術メモ ! すべての向き ! F0,F1,F2,F3, f0,f1,f2,f3 ! L0,L1,L2,L3, l0,l1,l2,l3 ! N0,N1,N2,N3, n0,n1,n2,n3 ! P0,P1,P2,P3, p0,p1,p2,p3 ! Y0,Y1,Y2,Y3, y0,y1,y2,y3 ! Z0,Z1, z0,z1 ! ! I0,I1 ! T0,T1,T2,T3 ! U0,U1,U2,U3 ! V0,V1,V2,V3 ! W0,W1,W2,W3 ! X0 DIM nam$(PIECE_COUNT),shape(PIECE_COUNT*PIECE_SIZE*8,2) !片のなまえ、8方向の形状 DIM shp(PIECE_SIZE,2) FOR i=1 TO PIECE_COUNT CALL get_shape(i, nam$(i),shp) !形状を得る FOR j=1 TO 2 !裏返し FOR k=1 TO 4 !回転 LET id=(j-1)*4+k CALL set_piece(i,id,shp, shape) !記録する CALL operate_piece(shp,R90) !+90度 NEXT k CALL operate_piece(shp,REV) !裏返す NEXT j NEXT i DIM piece(PIECE_COUNT,3) !片の向き(使用フラグを兼ねる)、配置位置 MAT piece=ZER LET t0=TIME FOR xx=1 TO INT((N-3)/2)+1 !X片を盤の左上1/4に置く FOR yy=1 TO INT((M-3)/2)+1 !※3=幅、高さ
LET shp1=get_piece(1,1) !形状を得る CALL check_site(shp1,yy,xx, K, shape, M,N,board$) !うまく置ければ IF K>PIECE_SIZE THEN LET piece(1,1)=1 !1番目 LET piece(1,2)=xx LET piece(1,3)=yy CALL put_piece(nam$(1),shp1,yy,xx, shape, board$) !配置する CALL display_board(M,N,board$) CALL try(2, piece,nam$, shape, M,N,board$, 1,1) !※ PRINT "計算時間=";TIME-t0 CALL put_piece(".",shp1,yy,xx, shape, board$) !元に戻す END IF NEXT yy NEXT xx END
|