dfs-全排列
阿新 • • 發佈:2018-12-24
要求:輸入一個為n的數,輸出1~n的全排列。
解法:本題可以用多重迴圈來做,但是過於繁瑣;但本題是一個典型的dfs問題,我們可以構造n個盒子,1~n個數看成n張卡片,我們需要做的就是如何將這n張卡片放入n個盒子中,且可以有多少種不同的放法,我們假定每個盒子中的卡片都是按照順序的順序放置,以n=3為例,在第一個盒子裡,我們按照1~3的順序放置一張1;在第二個盒子裡也是如此,但此時我們手中還剩下2和3,故放入2;同理第三個盒子裡放3。此時第一輪放法結束,接下來我們拿出第三個盒子裡的3,因為是按照1~3的順序來放置,所以無法在放入3,
我們將卡片拿在手上,來到第二個盒子並拿出裡面的卡片 ,此時我們手中有2和3兩張卡片,而對於第二個盒子,我們之前已近放過2,故按照順序,只能放入3,這時候我們再次來到第三個盒子,將第2放入,形成新的放法132,同理可得餘下所有的放法。具體程式碼如下:
#include<stdio.h> int a[10], book[10], n; void dfs(int step) { int i; if (step == n + 1)//第一輪所有盒子中都放滿了卡片,輸出 { for (i = 1; i <= n; i++) printf("%d",a[i]); printf("\n"); return; } for (i = 1; i <= n; i++)//對於第step個盒子,可放入1-n中任意的卡片,故用迴圈表示 { if (book[i] == 0) { a[step] = i; book[i] = 1; dfs(step+1); book[i] = 0;//將嘗試的卡片收回 } } return; } int main() { scanf("%d",&n); dfs(1); getchar(); getchar(); return 0; }