ac代码如下
#include<bits/stdc++.h>
using namespace std;
void permute(int arr[],int s,int t)
{
if(s == t)
{
for(int i = 1; i <= t; i++)
{
if(i == t) cout << arr[i] << endl;
else cout << arr[i] << " " ;
}
}else{
for(int k = s; k <= t; k ++)
{
int temp = arr[s];
arr[s] = arr[k];
arr[k] = temp;
permute(arr,s + 1, t);
temp = arr[s];
arr[s] = arr[k];
arr[k] = temp;
}
}
}
int main()
{
int n;
int arr[100];
cin >> n;
for(int i = 1; i <= n; i++) arr[i] = i;
permute(arr,1,n);
return 0;
}
一开始犯了个非常蠢的错误,代码如下:
#include<bits/stdc++.h>
using namespace std;
int arr[100];//错误!!!!!!!!!!!!
void permute(int s,int t)
{
if(s == t)
{
for(int i = 1; i <= t; i++)
{
if(i == t) cout << arr[i] << endl;
else cout << arr[i] << " " ;
}
}else{
for(int k = s; k <= t; k ++)
{
swap(s,k);
permute(s + 1, t);
swap(s,k);
}
}
}
void swap(int a, int b)
{
int temp = arr[a];
arr[a] = arr[b];
arr[b] = temp;
}
int main()
{
int n;
cin >> n;
for(int i = 1; i <= n; i++) arr[i] = i;
permute(1,n);
return 0;
}
这里我用了个全局的数组,然后permute函数中不传入这个数组,相当于所有的递归函数都公用一个数组显然是不行的,因为如此一来,递归函数执行完后再交换的两个数不是原本的两个数了,而传入参数的方式的话就不会出错。好菜好菜
注:这种方法用for把所有的元素放到第一位,然后接着递归。。。
所以以4为例,会有1,2,3,4作为开头,再剩下的数里继续排开头的元素,显然不会得到字典序。
字典序排列
如果给出一个 n , 让你给出 1 到 n 的字典序全排列,该怎么做呢?
可以这么想:从第一个开始考虑,每个位置考虑完了才考虑下一个。往里从小到大放可选的数,但不能是前面选过的。
代码如下:
#include<bits/stdc++.h>
using namespace std;
int arr[100];
int n;
void permute(int k);
int main()
{
cin >> n;
permute(1);
}
void permute(int k)
{
if(k == n+1)
{
for(int i = 1; i <= n; i++) cout << arr[i] << " ";
cout << endl;
}else{
for(int i = 1; i <= n; i++)
{
int flag = 1;
for(int t = 1; t < k; t++)
if(arr[t] == i)
{
flag = 0;
break;
}
if(flag)
{
arr[k] = i;
permute(k + 1);
}
}
}
}
这里用全局的参数就无所谓了。