fillrow = function(N,k,pos=1)
{
assign("count",1,envir=.GlobalEnv)
assign("mat",matrix(rep(0,k*choose(N+k-1,N)),ncol=k),envir=.GlobalEnv)
row = rep(0,k)
return(subfillrow(N,k,pos,row))
}
###
subfillrow = function(N,k,pos,row)
{
if (pos == k)
{
row[pos] = N
newmat = mat
newmat[count,] = row
assign("mat",newmat,envir=.GlobalEnv)
assign("count",count+1,envir=.GlobalEnv)
}
else
{
for (i in 0:N)
{
row[pos] = i
subfillrow(N-i,k,pos+1,row)
}
}
if (count == choose(N+k-1,N)+1)
{
return(mat)
}
}
###
fillrow(2,4)
ZmlsbHJvdyA9IGZ1bmN0aW9uKE4sayxwb3M9MSkKewogIGFzc2lnbigiY291bnQiLDEsZW52aXI9Lkdsb2JhbEVudikKICBhc3NpZ24oIm1hdCIsbWF0cml4KHJlcCgwLGsqY2hvb3NlKE4ray0xLE4pKSxuY29sPWspLGVudmlyPS5HbG9iYWxFbnYpCiAgcm93ID0gcmVwKDAsaykKICByZXR1cm4oc3ViZmlsbHJvdyhOLGsscG9zLHJvdykpCn0KIAojIyMKIApzdWJmaWxscm93ID0gZnVuY3Rpb24oTixrLHBvcyxyb3cpCnsKICBpZiAocG9zID09IGspCiAgewogICAgcm93W3Bvc10gPSBOCiAgICBuZXdtYXQgPSBtYXQKICAgIG5ld21hdFtjb3VudCxdID0gcm93CiAgICBhc3NpZ24oIm1hdCIsbmV3bWF0LGVudmlyPS5HbG9iYWxFbnYpCiAgICBhc3NpZ24oImNvdW50Iixjb3VudCsxLGVudmlyPS5HbG9iYWxFbnYpCiAgfQogIGVsc2UKICB7CiAgICBmb3IgKGkgaW4gMDpOKQogICAgewogICAgICByb3dbcG9zXSA9IGkKICAgICAgc3ViZmlsbHJvdyhOLWksayxwb3MrMSxyb3cpCiAgICB9CiAgfQogIGlmIChjb3VudCA9PSBjaG9vc2UoTitrLTEsTikrMSkKICB7CiAgICByZXR1cm4obWF0KQogIH0KfQoKIyMjCgpmaWxscm93KDIsNCk=
[,1] [,2] [,3] [,4]
[1,] 0 0 0 2
[2,] 0 0 1 1
[3,] 0 0 2 0
[4,] 0 1 0 1
[5,] 0 1 1 0
[6,] 0 2 0 0
[7,] 1 0 0 1
[8,] 1 0 1 0
[9,] 1 1 0 0
[10,] 2 0 0 0