90 lines
3 KiB
Text
90 lines
3 KiB
Text
Module Nonoblock (n, m) {
|
|
Print "Cells:",n," Blocks:",m
|
|
Dim n(1 to n), m(1 to m), sp(1 to m*2), sk(1 to m*2), part(1 to m)
|
|
queue=0
|
|
If m>0 Then {
|
|
Print "Block Size:",
|
|
For i=1 to m {
|
|
Read m(i)
|
|
Print m(i),
|
|
}
|
|
Print
|
|
part(m)=m(m)
|
|
If m>1 Then {
|
|
For i=m-1 to 1 {
|
|
part(i)=m(i)+part(i+1)+1
|
|
}
|
|
}
|
|
}
|
|
If part(1)>n Then {
|
|
Print "Impossible"
|
|
} Else {
|
|
p1=0
|
|
l=0
|
|
Counter=0
|
|
While p1<=n-part(1) {
|
|
k=0
|
|
p=p1+1
|
|
For i=1 to n {
|
|
n(i)=0
|
|
}
|
|
flag=True
|
|
Repeat {
|
|
While k<m {
|
|
k++
|
|
l=0
|
|
While l<m(k) and p<=n {
|
|
l++
|
|
n(p)=1
|
|
p++
|
|
}
|
|
If p<n Then {
|
|
n(p)=0
|
|
p++
|
|
If k<m Then {
|
|
If p+part(k+1)<n+1 Then {
|
|
queue++
|
|
sp(queue)=p
|
|
sk(queue)=k
|
|
}
|
|
}
|
|
}
|
|
}
|
|
flag=True
|
|
If l=m(k) Then {
|
|
counter++
|
|
Print Str$(counter,"0000 ");
|
|
For i=1 to n {
|
|
Print n(i);" ";
|
|
}
|
|
Print
|
|
If queue>0 Then {
|
|
p=sp(queue)
|
|
k=sk(queue)
|
|
queue--
|
|
For i=p to n {
|
|
n(i)=0
|
|
}
|
|
p++
|
|
If k<m Then {
|
|
If p+part(k+1)<n+1 Then {
|
|
queue++
|
|
sp(queue)=p
|
|
' sk(queue)=k
|
|
}
|
|
}
|
|
flag=False
|
|
}
|
|
}
|
|
} Until flag
|
|
p1++
|
|
If k=0 Then Exit
|
|
}
|
|
}
|
|
}
|
|
|
|
Nonoblock 5,2,2,1
|
|
Nonoblock 5,0
|
|
Nonoblock 10,1,8
|
|
Nonoblock 15,4,2,3,2,3
|
|
Nonoblock 5,2,3,2
|