1. 程式人生 > >1 ~ n 的全排列的個數

1 ~ n 的全排列的個數

拿輸入3為例子,首先要從1開始一個一個搜尋,輸出一遍開始回溯,即123輸出之後開始回溯,a【i】重新賦值標記的為0,a【i-1】也為0,由於for的迴圈,所以結束,輸出132,同樣回溯的過程也會回溯到第一個數,就是213,同理迴圈下去,直到回溯完輸出完程式繼續輸入想排的個數。
#include<cstdio>
#include<cstring>
using namespace std;
int a[10],vis[10],n;   // 存數陣列,標記陣列,幾位數
 
 void dfs(int step)
 {
  if(step == n + 1 )  //排一遍輸出
  {
   for(int i = 1 ; i <= n ; i ++)
   printf("%d",a[i]);
   printf("\n");
  }
  for(int  i = 1 ; i <= n ; i ++) 
  {
   if(vis[i] == 0 )
   {
    a[step] = i ; 
    vis[i] = 1 ;
    dfs(step + 1);  //遞迴
    vis[i] = 0 ;   //回溯
   }
  }
 }
int main()
{
 memset(vis,0,sizeof(vis));   //初始化標記陣列為 0  
 while(~scanf("%d",&n))
 {
  dfs(1);
    printf("\n");  //從一開始往裡搜尋 
  } 
 
  return 0;
}