#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
#include <limits.h>
/* #define DEBUG */
#if defined(DEBUG)
/*--------------------------------------------*/
#else
#define xmalloc(x, y) malloc(x)
#define xfree(x, y) free(x)
#define xmallocdump()
#endif
#define ID_ROOT 1001
#define ID_SUB 1002
#define ID_BUFF 1003
void calcPos(int idx, int *offset, int *mask) {
*offset = (idx - 1) / (CHAR_BIT * sizeof(int));
int index = (idx - 1) % (CHAR_BIT * sizeof(int));
int m = 1;
for (int i = 0; i < index; i++) m = (m << 1);
*mask = m;
}
int isBitOn(int *buff, int idx) {
int offset, mask;
calcPos(idx, &offset, &mask);
return ((buff[offset] & mask) > 0) ? 1 : 0;
}
void setBitOn(int *buff,int idx) {
int offset, mask;
calcPos(idx, &offset, &mask);
buff[offset] = buff[offset] | mask;
}
void permutation2(int lim, int n, int z, int *parent_buff1, int *buff2) {
if (n == 0) {
for (int i
= 0; i
< lim
; i
++) printf("%d ", buff2
[i
]); return;
}
for (int i = 1; i <= lim; i++) {
if (!isBitOn(parent_buff1, i)) {
buff2[lim - n] = i;
int *my_buff1 = xmalloc(z, ID_SUB);
if (my_buff1) {
memcpy(my_buff1
, parent_buff1
, z
); setBitOn(my_buff1, i);
permutation2(lim, n - 1, z, my_buff1, buff2);
xfree(my_buff1, ID_SUB);
}
}
}
}
void permutation(int n) {
int z;
int *buff1 = (int *)xmalloc((z = (n + (CHAR_BIT * sizeof(int))) / (CHAR_BIT * sizeof(int))), ID_ROOT);
int *buff2 = (int *)xmalloc(n, ID_BUFF);
if (buff1 || buff2) {
for (int i = 0; i < z; i++) buff1[i] = 0;
permutation2(n, n, z, buff1, buff2);
}
xfree(buff1, ID_ROOT);
xfree(buff2, ID_BUFF);
}
int main() {
permutation(4);
xmallocdump();
return 0;
}
/* end */
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPGN0eXBlLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgPGxpbWl0cy5oPgovKiAjZGVmaW5lIERFQlVHICovCgojaWYgZGVmaW5lZChERUJVRykKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiNlbHNlCiNkZWZpbmUgeG1hbGxvYyh4LCB5KSBtYWxsb2MoeCkKI2RlZmluZSB4ZnJlZSh4LCB5KSBmcmVlKHgpCiNkZWZpbmUgeG1hbGxvY2R1bXAoKQojZW5kaWYKCiNkZWZpbmUgSURfUk9PVCAgICAxMDAxCiNkZWZpbmUgSURfU1VCICAgICAxMDAyCiNkZWZpbmUgSURfQlVGRiAgICAxMDAzCgp2b2lkIGNhbGNQb3MoaW50IGlkeCwgaW50ICpvZmZzZXQsIGludCAqbWFzaykgewogICpvZmZzZXQgPSAoaWR4IC0gMSkgLyAoQ0hBUl9CSVQgKiBzaXplb2YoaW50KSk7CiAgaW50IGluZGV4ID0gKGlkeCAtIDEpICUgKENIQVJfQklUICogc2l6ZW9mKGludCkpOwogIGludCBtID0gMTsKICBmb3IgKGludCBpID0gMDsgaSA8IGluZGV4OyBpKyspIG0gPSAobSA8PCAxKTsKICAqbWFzayA9IG07Cn0KCmludCBpc0JpdE9uKGludCAqYnVmZiwgaW50IGlkeCkgewogIGludCBvZmZzZXQsIG1hc2s7CiAgY2FsY1BvcyhpZHgsICZvZmZzZXQsICZtYXNrKTsKICByZXR1cm4gKChidWZmW29mZnNldF0gJiBtYXNrKSA+IDApID8gMSA6IDA7Cn0KCnZvaWQgc2V0Qml0T24oaW50ICpidWZmLGludCBpZHgpIHsKICBpbnQgb2Zmc2V0LCBtYXNrOwogIGNhbGNQb3MoaWR4LCAmb2Zmc2V0LCAmbWFzayk7CiAgYnVmZltvZmZzZXRdID0gIGJ1ZmZbb2Zmc2V0XSB8IG1hc2s7Cn0KCnZvaWQgcGVybXV0YXRpb24yKGludCBsaW0sIGludCBuLCBpbnQgeiwgaW50ICpwYXJlbnRfYnVmZjEsIGludCAqYnVmZjIpIHsKICBpZiAobiA9PSAwKSB7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpbTsgaSsrKSBwcmludGYoIiVkICIsIGJ1ZmYyW2ldKTsKICAgIHB1dGNoYXIoJ1xuJyk7CiAgICByZXR1cm47CiAgfQoKICBmb3IgKGludCBpID0gMTsgaSA8PSBsaW07IGkrKykgewogICAgaWYgKCFpc0JpdE9uKHBhcmVudF9idWZmMSwgaSkpIHsKICAgICBidWZmMltsaW0gLSBuXSA9IGk7CiAgICAgIGludCAqbXlfYnVmZjEgPSB4bWFsbG9jKHosIElEX1NVQik7CiAgICAgIGlmIChteV9idWZmMSkgewogICAgICAgIG1lbWNweShteV9idWZmMSwgcGFyZW50X2J1ZmYxLCB6KTsKICAgICAgICBzZXRCaXRPbihteV9idWZmMSwgaSk7CiAgICAgICAgcGVybXV0YXRpb24yKGxpbSwgbiAtIDEsIHosIG15X2J1ZmYxLCBidWZmMik7CiAgICAgICAgeGZyZWUobXlfYnVmZjEsIElEX1NVQik7CiAgICAgIH0KICAgIH0KICB9Cn0KCnZvaWQgcGVybXV0YXRpb24oaW50IG4pIHsKICBpbnQgejsKICBpbnQgKmJ1ZmYxID0gKGludCAqKXhtYWxsb2MoKHogPSAobiArIChDSEFSX0JJVCAqIHNpemVvZihpbnQpKSkgLyAoQ0hBUl9CSVQgKiBzaXplb2YoaW50KSkpLCBJRF9ST09UKTsKICBpbnQgKmJ1ZmYyID0gKGludCAqKXhtYWxsb2MobiwgSURfQlVGRik7CiAgaWYgKGJ1ZmYxIHx8IGJ1ZmYyKSB7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IHo7IGkrKykgYnVmZjFbaV0gPSAwOwogICAgcGVybXV0YXRpb24yKG4sIG4sIHosIGJ1ZmYxLCBidWZmMik7CiAgfQogIHhmcmVlKGJ1ZmYxLCBJRF9ST09UKTsKICB4ZnJlZShidWZmMiwgSURfQlVGRik7Cn0KCmludCBtYWluKCkgewogIHBlcm11dGF0aW9uKDQpOwogIHhtYWxsb2NkdW1wKCk7CiAgcmV0dXJuIDA7Cn0KLyogZW5kICovCg==