思路? 依次枚舉 每個位置用哪個數字?
要求按照字典序最小來輸出
而每次搜索下一層時i都是從1開始
也就是說 如果有小的數可以填上 那么該方案會填上這個數字
例如 當n等于3?
第一次搜索
1 2 3輸出后返回
返回后此時i=3 第二個位置填3
1 3 2 輸出后返回
此時返回到第一層
i來到2
第一個位置填2
1 還沒被用過
因此?
2 1 3
以此推類
代碼
#include<iostream>
#include<algorithm>
#include<string>
using namespace std;
int n;
const int N=10;
int st[N];
bool used[N];?
void dfs(int u){
?? ?if(u>n){
?? ??? ?for(int i=1;i<=n;i++){
?? ??? ??? ?cout<<st[i]<<' ';
?? ??? ?}
?? ??? ?cout<<endl;
?? ??? ?return;
?? ?}
?? ?for(int i=1;i<=n;i++){
?? ??? ?if(!used[i]){
?? ??? ??? ?//如果該數沒被用過 將位置填入該數?
?? ??? ??? ?used[i]=true;
?? ??? ??? ?st[u]=i;
?? ??? ??? ?dfs(u+1);
?? ??? ??? ?//搜索下一層 ?
?? ??? ??? ?used[i]=false;//恢復現場?
?? ??? ??? ?st[u]=0;//恢復現場
?? ??? ??? ??
?? ??? ?}
?? ?}
?? ?
}
int main(){
?? ?cin>>n;
?? ?dfs(1);
?? ?
?? ?
?? ?return 0;
}#include<iostream>
#include<algorithm>
#include<string>
using namespace std;
int n;
const int N=10;
int st[N];
bool used[N];?
void dfs(int u){
?? ?if(u>n){
?? ??? ?for(int i=1;i<=n;i++){
?? ??? ??? ?cout<<st[i]<<' ';
?? ??? ?}
?? ??? ?cout<<endl;
?? ??? ?return;
?? ?}
?? ?for(int i=1;i<=n;i++){
?? ??? ?if(!used[i]){
?? ??? ??? ?//如果該數沒被用過 將位置填入該數?
?? ??? ??? ?used[i]=true;
?? ??? ??? ?st[u]=i;
?? ??? ??? ?dfs(u+1);
?? ??? ??? ?//搜索下一層 ?
?? ??? ??? ?used[i]=false;//恢復現場?
?? ??? ??? ?st[u]=0;//恢復現場
?? ??? ??? ??
?? ??? ?}
?? ?}
?? ?
}
int main(){
?? ?cin>>n;
?? ?dfs(1);
?? ?
?? ?
?? ?return 0;
}