ペントミノパズル
- しばっち
2025/10/13 (Mon) 08:24:36
ペントミノ
https://ja.wikipedia.org/wiki/ペントミノ
実行すると下記のような問題を出力します。
0 0 0 4 1 3 2
0□□□□□□□
0□□□□□□□
1□□□□□□□
2□□□□□□□
3□□□□□□□
3□□□□□□□
1□□□□□□□
0 0 0 3 5 2 0
0□□□□□□□
0□□□□□□□
1□□□□□□□
3□□□□□□□
2□□□□□□□
2□□□□□□□
2□□□□□□□
0 0 0 3 2 3 2
0□□□□□□□
1□□□□□□□
3□□□□□□□
3□□□□□□□
2□□□□□□□
1□□□□□□□
0□□□□□□□
縦横にある数だけコマ(ペントミノ)の形にマスを埋めていくパズルです。
コマは12種類(DATA文参照)あります。2種類以上(同種含む)のコマを
使用しています。
RANDOMIZE
LET SIZE=7
READ NSIZE,NMAX
DIM MASU(SIZE,SIZE),KOMA(NMAX,NSIZE,NSIZE),KOMA2(NSIZE,NSIZE)
FOR P=1 TO NMAX
FOR L=1 TO NSIZE
READ S$
FOR M=1 TO NSIZE
IF S$(M:M)="*" THEN LET KOMA(P,L,M)=P
NEXT M
NEXT L
NEXT P
OPEN #1:NAME "ペントミノパズル問題.txt"
OPEN #2:NAME "ペントミノパズル解答.txt"
ERASE #1
ERASE #2
FOR K=1 TO 20 ! 問題数
LET NUM=0
MAT MASU=ZER
DO
FOR Q=1 TO 30 ! 試行回数
LET COL=INT(RND*SIZE+1)
LET ROW=INT(RND*SIZE+1)
LET P=INT(RND*NMAX+1) ! コマの種類
! LET ROT=INT(RND*8)
CALL ROTATE(ROT,P) ! 回転
IF CHECK(ROW,COL)=1 THEN
CALL PUT(ROW,COL)
LET NUM=NUM+1
END IF
NEXT Q
LOOP UNTIL NUM>=2 ! コマ2種類以上なら
PRINT #1:" ";
FOR M=1 TO SIZE
LET S=0
FOR L=1 TO SIZE
IF MASU(L,M)<>0 THEN LET S=S+1
NEXT L
PRINT #1,USING "##":S;
NEXT M
PRINT #1
FOR L=1 TO SIZE
LET S=0
FOR M=1 TO SIZE
IF MASU(L,M)<>0 THEN LET S=S+1
NEXT M
PRINT #1,USING "##":S;
PRINT #1:REPEAT$("□",SIZE)
NEXT L
PRINT #1
FOR L=1 TO SIZE
FOR M=1 TO SIZE
SELECT CASE MASU(L,M)
CASE 0
PRINT #2:"□";
CASE 1,7
PRINT #2:"■";
CASE 2,8
PRINT #2:"◆";
CASE 3,9
PRINT #2:"●";
CASE 4,10
PRINT #2:"▲";
CASE 5,11
PRINT #2:"▼";
CASE 6,12
PRINT #2:"★";
END SELECT
NEXT M
PRINT #2
NEXT L
PRINT #2
NEXT K
CLOSE #1
CLOSE #2
FUNCTION CHECK(ROW,COL)
LET C=0
FOR L=1 TO NSIZE
FOR M=1 TO NSIZE
IF ROW+L<=SIZE AND COL+M<=SIZE THEN
IF MASU(ROW+L,COL+M)=0 AND KOMA2(L,M)<>0 THEN
LET C=C+1
END IF
END IF
NEXT M
NEXT L
IF C=NSIZE THEN LET CHECK=1 ELSE LET CHECK=0
END FUNCTION
SUB PUT(ROW,COL)
FOR L=1 TO NSIZE
FOR M=1 TO NSIZE
IF KOMA2(L,M)<>0 THEN LET MASU(ROW+L,COL+M)=KOMA2(L,M)
NEXT M
NEXT L
END SUB
SUB ROTATE(ROT,P)
SELECT CASE ROT
CASE 0
FOR L=1 TO NSIZE
FOR M=1 TO NSIZE
LET KOMA2(L,M)=KOMA(P,L,M)
NEXT M
NEXT L
CASE 1 ! 右回転
FOR L=1 TO NSIZE
FOR M=1 TO NSIZE
LET KOMA2(L,NSIZE-M+1)=KOMA(P,M,L)
NEXT M
NEXT L
CASE 2 ! 左回転
FOR L=1 TO NSIZE
FOR M=1 TO NSIZE
LET KOMA2(NSIZE-L+1,M)=KOMA(P,M,L)
NEXT M
NEXT L
CASE 3 ! 180度回転
FOR L=1 TO NSIZE
FOR M=1 TO NSIZE
LET KOMA2(L,M)=KOMA(P,NSIZE-L+1,NSIZE-M+1)
NEXT M
NEXT L
CASE 4 ! 左右反転
FOR L=1 TO NSIZE
FOR M=1 TO NSIZE
LET KOMA2(L,M)=KOMA(P,L,NSIZE-M+1)
NEXT M
NEXT L
CASE 5 ! 上下反転
FOR L=1 TO NSIZE
FOR M=1 TO NSIZE
LET KOMA2(L,M)=KOMA(P,NSIZE-L+1,M)
NEXT M
NEXT L
CASE 6 ! 左右反転左回転
FOR L=1 TO NSIZE
FOR M=1 TO NSIZE
LET KOMA2(L,NSIZE-M+1)=KOMA(P,NSIZE-M+1,L)
NEXT M
NEXT L
CASE 7 ! 左右反転右回転
FOR L=1 TO NSIZE
FOR M=1 TO NSIZE
LET KOMA2(NSIZE-L+1,M)=KOMA(P,NSIZE-M+1,L)
NEXT M
NEXT L
END SELECT
END SUB
!DATA 3,2 ! トロミノ(点3つ)
!DATA " * " ! I
!DATA " * "
!DATA " * "
!
!DATA " * " ! L
!DATA " **"
!DATA " "
!DATA 4,5 ! テトロミノ(点4つ)
!DATA " * " ! I
!DATA " * "
!DATA " * "
!DATA " * "
!
!DATA " * " ! L
!DATA " * "
!DATA " ** "
!DATA " "
!
!DATA " ** " ! O
!DATA " ** "
!DATA " "
!DATA " "
!
!DATA " " ! T
!DATA "*** "
!DATA " * "
!DATA " "
!
!DATA "** " ! Z
!DATA " ** "
!DATA " "
!DATA " "
DATA 5,12 ! ペントミノ(点5つ)
DATA " " ! X
DATA " * "
DATA " *** "
DATA " * "
DATA " "
!
DATA " " ! F
DATA " ** "
DATA " ** "
DATA " * "
DATA " "
!
DATA " * " ! L
DATA " * "
DATA " * "
DATA " ** "
DATA " "
!
DATA " " ! W
DATA " * "
DATA " ** "
DATA " ** "
DATA " "
!
DATA " " ! Z
DATA " ** "
DATA " * "
DATA " ** "
DATA " "
!
DATA " * " ! I
DATA " * "
DATA " * "
DATA " * "
DATA " * "
!
DATA " * " ! N
DATA " ** "
DATA " * "
DATA " * "
DATA " "
!
DATA " " ! P
DATA " ** "
DATA " ** "
DATA " * "
DATA " "
!
DATA " " ! T
DATA " *** "
DATA " * "
DATA " * "
DATA " "
!
DATA " * " ! Y
DATA " ** "
DATA " * "
DATA " * "
DATA " "
!
DATA " " ! U
DATA " * * "
DATA " *** "
DATA " "
DATA " "
!
DATA " " ! V
DATA " * "
DATA " * "
DATA " *** "
DATA " "
END
解答
□□□□□□□
□□□□□□□
□□□●□□□
□□□●□□■
□□□●□■■
□□□●●■□
□□□□□■□
□□□□□□□
□□□□□□□
□□□□■□□
□□□■■■□
□□□▲■□□
□□□▲▲□□
□□□□▲▲□
□□□□□□□
□□□□□□■
□□□□■■■
□□□■■■□
□□□■□■□
□□□■□□□
□□□□□□□
Re: ペントミノパズル
- しばっち
2025/10/13 (Mon) 08:26:34
https://ja.wikipedia.org/wiki/ヘキソミノ
コマの種類が35個になったヘキソミノです。
RANDOMIZE
LET SIZE=8
READ NSIZE,NMAX
DIM MASU(SIZE,SIZE),KOMA(NMAX,NSIZE,NSIZE)
FOR P=1 TO NMAX
FOR L=1 TO NSIZE
READ S$
FOR M=1 TO NSIZE
IF S$(M:M)="*" THEN LET KOMA(P,L,M)=P
NEXT M
NEXT L
NEXT P
OPEN #1:NAME "ヘキソミノパズル問題.txt"
OPEN #2:NAME "ヘキソミノパズル解答.txt"
ERASE #1
ERASE #2
FOR K=1 TO 20 ! 問題数
LET NUM=0
MAT MASU=ZER
DO
FOR Q=1 TO 30 ! 試行回数
LET COL=INT(RND*SIZE+1)
LET ROW=INT(RND*SIZE+1)
LET P=INT(RND*NMAX+1)
IF CHECK(ROW,COL,P)=1 THEN
CALL PUT(ROW,COL,P)
LET NUM=NUM+1
END IF
NEXT Q
LOOP UNTIL NUM>=2 ! コマ2種類以上なら
PRINT #1:" ";
FOR M=1 TO SIZE
LET S=0
FOR L=1 TO SIZE
IF MASU(L,M)<>0 THEN LET S=S+1
NEXT L
PRINT #1,USING "##":S;
NEXT M
PRINT #1
FOR L=1 TO SIZE
LET S=0
FOR M=1 TO SIZE
IF MASU(L,M)<>0 THEN LET S=S+1
NEXT M
PRINT #1,USING "##":S;
PRINT #1:REPEAT$("□",SIZE)
NEXT L
PRINT #1
FOR L=1 TO SIZE
FOR M=1 TO SIZE
SELECT CASE MASU(L,M)
CASE 0
PRINT #2:"□";
CASE 1,7,13,19,25,31
PRINT #2:"■";
CASE 2,8,14,20,26,32
PRINT #2:"◆";
CASE 3,9,15,21,27,33
PRINT #2:"●";
CASE 4,10,16,22,28,34
PRINT #2:"▲";
CASE 5,11,17,23,29,35
PRINT #2:"▼";
CASE 6,12,18,24,30
PRINT #2:"★";
END SELECT
NEXT M
PRINT #2
NEXT L
PRINT #2
NEXT K
CLOSE #1
CLOSE #2
FUNCTION CHECK(ROW,COL,P)
LET C=0
FOR L=1 TO NSIZE
FOR M=1 TO NSIZE
IF ROW+L<=SIZE AND COL+M<=SIZE THEN
IF MASU(ROW+L,COL+M)=0 AND KOMA(P,L,M)<>0 THEN
LET C=C+1
END IF
END IF
NEXT M
NEXT L
IF C=NSIZE THEN LET CHECK=1 ELSE LET CHECK=0
END FUNCTION
SUB PUT(ROW,COL,P)
FOR L=1 TO NSIZE
FOR M=1 TO NSIZE
IF KOMA(P,L,M)<>0 THEN LET MASU(ROW+L,COL+M)=KOMA(P,L,M)
NEXT M
NEXT L
END SUB
DATA 6,35 ! ヘキソミノ(点6つ)
DATA " "
DATA " "
DATA "******"
DATA " "
DATA " "
DATA " "
!
DATA " "
DATA " "
DATA " * "
DATA "***** "
DATA " "
DATA " "
!
DATA " "
DATA " "
DATA " * "
DATA "***** "
DATA " "
DATA " "
!
DATA " "
DATA " "
DATA " * "
DATA "***** "
DATA " "
DATA " "
!
DATA " "
DATA " "
DATA " ** "
DATA " **** "
DATA " "
DATA " "
!
DATA " "
DATA " "
DATA " * * "
DATA " **** "
DATA " "
DATA " "
!
DATA " "
DATA " "
DATA " * * "
DATA " **** "
DATA " "
DATA " "
!
DATA " "
DATA " * "
DATA " * "
DATA " **** "
DATA " "
DATA " "
!
DATA " "
DATA " "
DATA " ** "
DATA " **** "
DATA " "
DATA " "
!
DATA " "
DATA " * "
DATA " * "
DATA " **** "
DATA " "
DATA " "
!
DATA " "
DATA " * "
DATA " **** "
DATA " * "
DATA " "
DATA " "
!
DATA " "
DATA " * "
DATA " **** "
DATA " * "
DATA " "
DATA " "
!
DATA " "
DATA " * "
DATA " **** "
DATA " * "
DATA " "
DATA " "
!
DATA " "
DATA " * "
DATA " **** "
DATA " * "
DATA " "
DATA " "
!
DATA " "
DATA " * "
DATA " **** "
DATA " * "
DATA " "
DATA " "
!
DATA " "
DATA " * "
DATA " **** "
DATA " * "
DATA " "
DATA " "
!
DATA " "
DATA " "
DATA " **"
DATA " **** "
DATA " "
DATA " "
!
DATA " "
DATA " * "
DATA "** "
DATA " *** "
DATA " "
DATA " "
!
DATA " "
DATA " "
DATA " ** * "
DATA " *** "
DATA " "
DATA " "
!
DATA " "
DATA " "
DATA "*** "
DATA " *** "
DATA " "
DATA " "
!
DATA " "
DATA " "
DATA " *** "
DATA " *** "
DATA " "
DATA " "
!
DATA " "
DATA " * "
DATA " *** "
DATA " ** "
DATA " "
DATA " "
!
DATA " "
DATA " * "
DATA " *** "
DATA " ** "
DATA " "
DATA " "
!
DATA " "
DATA " ** "
DATA " * "
DATA " *** "
DATA " "
DATA " "
!
DATA " "
DATA " * "
DATA " ** "
DATA " *** "
DATA " "
DATA " "
!
DATA " "
DATA " "
DATA " *** "
DATA " *** "
DATA " "
DATA " "
!
DATA " "
DATA " * "
DATA " ** "
DATA " *** "
DATA " "
DATA " "
!
DATA " "
DATA " ** "
DATA " * "
DATA " *** "
DATA " "
DATA " "
!
DATA " "
DATA " ** "
DATA " *** "
DATA " * "
DATA " "
DATA " "
!
DATA " "
DATA " * "
DATA " *** "
DATA " ** "
DATA " "
DATA " "
!
DATA " "
DATA " * "
DATA " *** "
DATA " ** "
DATA " "
DATA " "
!
DATA " "
DATA " ** "
DATA " ** "
DATA " ** "
DATA " "
DATA " "
!
DATA " "
DATA " * "
DATA " *** "
DATA " * * "
DATA " "
DATA " "
!
DATA " "
DATA " * "
DATA " *** "
DATA " * * "
DATA " "
DATA " "
!
DATA " "
DATA " ** "
DATA " ** "
DATA " ** "
DATA " "
DATA " "
END