#include <stdio.h>
#include <vector>
const char digitset[ ] = "123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" ;
void allocate_to_groups_impl( std:: vector < char > & usage, std:: vector < int > & order, const std:: vector < int > & cumsum, int group, int place, int min )
{
if ( place == cumsum[ group] ) {
group++ ; min = 0 ;
if ( group == cumsum.size ( ) ) {
for ( std:: vector < int > :: iterator it = order.begin ( ) ; it ! = order.end ( ) ; ++ it )
putchar ( digitset[ * it] ) ;
putchar ( '\n ' ) ;
return ;
}
}
for ( int v = min, max = usage.size ( ) + place - cumsum[ group] ; v <= max; ++ v ) {
if ( ! usage[ v] ) {
order[ place] = v;
usage[ v] = 1 ;
allocate_to_groups_impl( usage, order, cumsum, group, place+ 1 , v+ 1 ) ;
usage[ v] = 0 ;
}
}
}
template < size_t Ngroups>
void allocate_to_groups( int ( & c) [ Ngroups] )
{
size_t sum_of_c = 0 ;
std:: vector < int > cumsum_of_c;
for ( int it = c; it < c + Ngroups; ++ it )
cumsum_of_c.push_back ( sum_of_c + = * it) ;
std:: vector < int > order( sum_of_c) ;
std:: vector < char > usage( sum_of_c) ;
allocate_to_groups_impl( usage, order, cumsum_of_c, 0 , 0 , 0 ) ;
}
int main( void )
{
int c[ ] = { 2 , 3 , 2 } ;
allocate_to_groups( c) ;
} ;
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDx2ZWN0b3I+Cgpjb25zdCBjaGFyIGRpZ2l0c2V0W10gPSAiMTIzNDU2Nzg5QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVoiOwoKdm9pZCBhbGxvY2F0ZV90b19ncm91cHNfaW1wbCggc3RkOjp2ZWN0b3I8Y2hhcj4mIHVzYWdlLCBzdGQ6OnZlY3RvcjxpbnQ+JiBvcmRlciwgY29uc3Qgc3RkOjp2ZWN0b3I8aW50PiYgY3Vtc3VtLCBpbnQgZ3JvdXAsIGludCBwbGFjZSwgaW50IG1pbiApCnsKICAgIGlmIChwbGFjZSA9PSBjdW1zdW1bZ3JvdXBdKSB7CiAgICAgICAgZ3JvdXArKzsgbWluID0gMDsKICAgICAgICBpZiAoZ3JvdXAgPT0gY3Vtc3VtLnNpemUoKSkgewogICAgICAgICAgICBmb3IoIHN0ZDo6dmVjdG9yPGludD46Oml0ZXJhdG9yIGl0ID0gb3JkZXIuYmVnaW4oKTsgaXQgIT0gb3JkZXIuZW5kKCk7ICsraXQgKQogICAgICAgICAgICAgICAgcHV0Y2hhcihkaWdpdHNldFsqaXRdKTsKICAgICAgICAgICAgcHV0Y2hhcignXG4nKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBmb3IoIGludCB2ID0gbWluLCBtYXggPSB1c2FnZS5zaXplKCkgKyBwbGFjZSAtIGN1bXN1bVtncm91cF07IHYgPD0gbWF4OyArK3YgKSB7CiAgICAgICAgaWYgKCF1c2FnZVt2XSkgewogICAgICAgICAgICBvcmRlcltwbGFjZV0gPSB2OwogICAgICAgICAgICB1c2FnZVt2XSA9IDE7CiAgICAgICAgICAgIGFsbG9jYXRlX3RvX2dyb3Vwc19pbXBsKHVzYWdlLCBvcmRlciwgY3Vtc3VtLCBncm91cCwgcGxhY2UrMSwgdisxKTsKICAgICAgICAgICAgdXNhZ2Vbdl0gPSAwOwogICAgICAgIH0KICAgIH0KfQoKdGVtcGxhdGU8c2l6ZV90IE5ncm91cHM+CnZvaWQgYWxsb2NhdGVfdG9fZ3JvdXBzKCBpbnQgKCZjKVtOZ3JvdXBzXSApCnsKICAgIHNpemVfdCBzdW1fb2ZfYyA9IDA7CiAgICBzdGQ6OnZlY3RvcjxpbnQ+IGN1bXN1bV9vZl9jOwogICAgZm9yKCBpbnQgaXQgPSBjOyBpdCA8IGMgKyBOZ3JvdXBzOyArK2l0ICkKICAgICAgICBjdW1zdW1fb2ZfYy5wdXNoX2JhY2soc3VtX29mX2MgKz0gKml0KTsKICAgIHN0ZDo6dmVjdG9yPGludD4gb3JkZXIoc3VtX29mX2MpOwogICAgc3RkOjp2ZWN0b3I8Y2hhcj4gdXNhZ2Uoc3VtX29mX2MpOwoKICAgIGFsbG9jYXRlX3RvX2dyb3Vwc19pbXBsKHVzYWdlLCBvcmRlciwgY3Vtc3VtX29mX2MsIDAsIDAsIDApOwp9CgppbnQgbWFpbih2b2lkKQp7CiAgICBpbnQgY1tdID0geyAyLCAzLCAyIH07CiAgICBhbGxvY2F0ZV90b19ncm91cHMoYyk7Cn07
compilation info
prog.cpp: In function 'void allocate_to_groups(int (&)[Ngroups])':
prog.cpp:34:44: error: invalid type argument of unary '*'
prog.cpp: In function 'void allocate_to_groups(int (&)[Ngroups]) [with unsigned int Ngroups = 3u]':
prog.cpp:44:25: instantiated from here
prog.cpp:33:19: error: invalid conversion from 'int*' to 'int'
prog.cpp:33:19: error: ISO C++ forbids comparison between pointer and integer
stdout