全排列問題
這一周的問題是列印出0-7的全排列,看上去是很簡單的題目了,呵呵,,,,難道你想用七層迴圈嗎?呵呵。。不知道時候可行,但是一定不是很好看呀,我的編程習慣告誡我不能這樣,在那本書上看過,最好不要多於三層。 後來張鵬告訴我這是一個深度優先搜尋的問題,看了一下《演算法導論》,不是很懂呀。。。。不過也看出了一些思路,就是對已經用過的元素進行標記,所以我使用了二維數組,經過兩個小時左右的編碼,調試,我終於實現了,而且可以是0-9的全排列。。原始碼如下: #include<stdio.h>#define NUM 10 /* 任意定義數位數目,本題為8 */int a[NUM][2]; /* 儲存數字和狀態 */int b[NUM], total = 0; /* 儲存每次的數字,排列總數 */void init(void) /* 初始化數組 */{int i;for (i = 0; i < NUM; i++) { a[i][0] = i; /* 0——NUM - 1 賦值 */a[i][1] = 0; /* 狀態:0,未使用 */}}void pai(int num)/* 定義排列的函數,參數num表示排列的位置0——NUM-1 */{int i;for(i = 0; i < NUM; i++) {if (a[i][1] == 1) /* 已經使用*/continue;a[i][1] = 1; /* 1,使用 */b[num] = a[i][0]; /* num位的數字 */if(num == NUM - 1){ /* 列印結果 */int j;for (j = 0; j < NUM; j++)printf("%d", b[j]);printf("/n");total++; /* 計數 */a[i][1] = 0; /* 回複為未使用 */return; /* 重新開始 */}pai(num+1); /* 排列下一個 */a[i][1] = 0; /* 回複為未使用 */}}int main(){init(); /* 初始化 */pai(0); /* 開始排列 */printf("the total is %d/n", total);return 0;}