53 lines
1.3 KiB
Plaintext
53 lines
1.3 KiB
Plaintext
DIM list1%(2) : list1%() = 2, 0, 2
|
|
PRINT "partitions(2,0,2):"
|
|
PRINT FNpartitions(list1%())
|
|
DIM list2%(2) : list2%() = 1, 1, 1
|
|
PRINT "partitions(1,1,1):"
|
|
PRINT FNpartitions(list2%())
|
|
DIM list3%(3) : list3%() = 1, 2, 0, 1
|
|
PRINT "partitions(1,2,0,1):"
|
|
PRINT FNpartitions(list3%())
|
|
END
|
|
|
|
DEF FNpartitions(list%())
|
|
LOCAL i%, j%, n%, p%, o$, x%()
|
|
n% = DIM(list%(),1)
|
|
DIM x%(SUM(list%())-1)
|
|
FOR i% = 0 TO n%
|
|
IF list%(i%) THEN
|
|
FOR j% = 1 TO list%(i%)
|
|
x%(p%) = i%
|
|
p% += 1
|
|
NEXT
|
|
ENDIF
|
|
NEXT i%
|
|
REPEAT
|
|
FOR i% = 0 TO n%
|
|
o$ += " ( "
|
|
FOR j% = 0 TO DIM(x%(),1)
|
|
IF x%(j%) = i% o$ += STR$(j%+1) + " "
|
|
NEXT
|
|
o$ += ")"
|
|
NEXT i%
|
|
o$ += CHR$13 + CHR$10
|
|
UNTIL NOT FNperm(x%())
|
|
= o$
|
|
|
|
DEF FNperm(x%())
|
|
LOCAL i%, j%
|
|
FOR i% = DIM(x%(),1)-1 TO 0 STEP -1
|
|
IF x%(i%) < x%(i%+1) EXIT FOR
|
|
NEXT
|
|
IF i% < 0 THEN = FALSE
|
|
j% = DIM(x%(),1)
|
|
WHILE x%(j%) <= x%(i%) j% -= 1 : ENDWHILE
|
|
SWAP x%(i%), x%(j%)
|
|
i% += 1
|
|
j% = DIM(x%(),1)
|
|
WHILE i% < j%
|
|
SWAP x%(i%), x%(j%)
|
|
i% += 1
|
|
j% -= 1
|
|
ENDWHILE
|
|
= TRUE
|