遞回實作排列型列舉
把 1~n 這 n 個整數排成一行后隨機打亂順序,輸出所有可能的次序,
輸入
一個整數n,
輸出
按照從小到大的順序輸出所有方案,每行1個,
首先,同一行相鄰兩個數用一個空格隔開,
其次,對于兩個不同的行,對應下標的數一一比較,字典序較小的排在前面,
資料范圍
1≤n≤9
輸入樣例:
3
輸出樣例
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
已AC代碼
#include<stdio.h>
int num[1000];
int a;
void f(int b,int c){
if(b==a){
for(int i=0;i<a;i++){
printf("%d ",num[i]);
}
printf("\n");
return;
}
else{
for(int i = 1;i<=a;i++){
if (!((c>>i)&1)){
num[b++]=i;
f(b,c|1<<i);
b--;
}
}
}
}
int main(){
scanf("%d",&a);
f(0,0);
return 0;
}
注意點
1、f(x,y)——x代表已遍歷到第x個數,y是一個二進制數,用狀態壓縮的方法記錄這每個數的使用情況——0和1代表是否被使用過
2、遞回為:x遞回加一,y記錄狀態,當x加到n,則輸出
3、!((c>>i)&1:該陳述句用位運算的方法判斷是否用過i資料
4、f(b,c|1<<i);:該陳述句負責記錄i資料已經被用過,且進行下一次回圈
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/244746.html
標籤:其他
上一篇:一個c++撰寫的語法分析器(編譯愿意LL(1)文法)
下一篇:Xlua移動端控制物體旋轉和縮放
