網路城邦
回本城市首頁 唐老鴨之家
市長:  副市長:
加入本城市推薦本城市加入我的最愛訂閱最新文章
udn城市資訊科技網路分享【唐老鴨之家】城市/討論區/
討論區C Programming Language 字體:
上一個討論主題 回文章列表 下一個討論主題
一個產生1至n所有排列的C程式
 瀏覽448|回應0推薦0


等級:6
留言加入好友
/* This program generates all permutations of 1 2 3 ... n */

#include
#define SWAP(a, b) a = a + b - (b = a)

void printv(int v[], int n) {
int i;
for (i = 0; i < n; i++)
printf("%d ", v[i]);
printf("\n");
}

/* Generates the next permutation of the vector v of length n.
@return 1, if there are no more permutations to be generated
@return 0, otherwise */
int next(int v[], int n) {
/* Find the largest i */
int i, j, k;
i = n - 2;
while ((i >= 0) && (v[i] > v[i + 1]))
--i;
/* If i is smaller than 0, then there are no more permutations. */
if (i < 0)
return 1;
/* Find the largest element after vi but not larger than vi */
k = n - 1;
while (v[i] > v[k])
--k;
SWAP(v[i], v[k]);
/* Swap the last n - i elements. */
k = 0;
for (j = i + 1; j < (n + i) / 2 + 1; ++j, ++k)
SWAP(v[j], v[n - k - 1]);
return 0;
}

int main() {
int v[128];
int n;
int done, i;

scanf("%d",&n);

/* The initial permutation is 1 2 3 ...*/
for (i = 0; i < n; ++i)
v[i] = i + 1;
printv(v, n);
done = 1;
do {
if (!(done = next(v, n)))
printv(v, n); /* P3 */
} while (!done);
system("PAUSE");
return 0;
}

本文於 修改第 1 次
回應 回應給此人 推薦文章 列印 加入我的文摘

引用
引用網址:https://city.udn.com/forum/trackback.jsp?no=58536&aid=4819762