Nonoblock: Difference between revisions
Content added Content deleted
Line 1,066: | Line 1,066: | ||
</pre > |
</pre > |
||
===Non Recursive=== |
|||
<lang M2000 Interpreter> |
|||
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) και 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 |
|||
</lang> |
|||
=={{header|Phix}}== |
=={{header|Phix}}== |