输入正整数N,输出由1到N这N个数(N<=7)的所有排列,每行一个排列,数与数之间有一个空格,两个排列中,第一个数小的优先输出,第一个数相同,比较第二个数,后面以此类推。
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
int n,c=0;
cin >> n;
vector<int>zq(n);
for (auto &i : zq)
i = ++c;
do {
for (auto &i : zq)
cout << i << " ";
cout << endl;
}
while(next_permutation(zq.begin(), zq.end()));//当前序列不存在下一个排列时,函数返回false,否则返回true.所以要用do while
return 0;
} #include<iostream>
#include <string>
using namespace std;
int a[10], book[10], n;//C语言的全局变量没赋值之前都是0
void dfs(int step)//step表示站在第几个盒子前
{
if (step == n + 1)//如果站在第n+1个盒子前,表示前n个盒子已经放好扑克牌
{
for (int i = 1; i <= n; ++i)
cout << a[i]<<" ";
cout << endl;
return;
}
for (int i = 1; i <= n; ++i)//一共n张牌
{
if (book[i] == 0)//表示i号扑克牌还在手上
{
a[step] = i;//将i号扑克牌放入到第step个盒子中
book[i] = 1;//表示i号牌已经放了,不在手上
dfs(step+1);//第step个盒子已经放好扑克牌,接下来要走到下一个盒子
book[i] = 0;//将牌收回,进行下一次尝试
}
}
return;
}
int main()
{
cin >> n;
dfs(1);//首先站在1号盒子前,
return 0;
} #include<bits/stdc++.h>
using namespace std;
bool mark[10];
int ans[10];
int n;
void DFS(int num)
{
if(num==n+1)
{
for(int i=1;i<=n;i++)
cout<<ans[i]<<" ";
cout<<endl;
return;
}
for(int i=1;i<=n;i++)
{
if(mark[i]==false)
{
mark[i]=true;
ans[num]=i;
DFS(num+1);
mark[i]=false;
}
}
return ;
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++) mark[i]=false;
//mark[1]=true;
DFS(1);
return 0;
}DFS函数中判断num==n+1,从i=1遍历,ans[num]=i,主函数中不用mark[1]=true;num==n,从i=2遍历,ans[num+1]=i,主函数需要写mark[1]=true。而且两中方法得出的结果不一样,请问有谁知道这怎么解释吗?回溯法我不是很懂。