该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
#include
typedef enum
{
false = 0,
true = !false
} bool;
void
iter_swap(int* p, int* q)
{
int t = *p;
*p = *q;
*q = t;
}
void
reverse(int* first, int* last)
{
if (first == last)
return;
--last;
while (first < last)
{
iter_swap(first, last);
++first;
--last;
}
}
bool
next_permutation(int* first, int* last)
{
if(first == last)
return false;
int* p = first;
++p;
if (p == last)
return false;
p = last;
--p;
for(;;)
{
int* pi = p;
--p;
if (*p < *pi)
{
int* q = last;
while (!(*p < *--q))
;
iter_swap(p, q);
reverse(pi, last);
return true;
}
if (p == first)
{
reverse(first, last);
return false;
}
}
}
int main(void)
{
int list[] = {1, 2, 2, 4};
do {
printf("%d %d %d %d\n", list[0], list[1], list[2], list[3]);
} while (next_permutation(list, list + sizeof(list) / sizeof(int)));
getchar();
return 0;
}