排列
读入整数n、x和y ( 1<=n<=10,x∈[1,n],y∈[1,n] )
输出描述 Output Description
每行n个用空格隔开的数,表示一个符合条件的排列。并且所有排列按字典序输出。
样例输入 Sample Input
3 1 2
样例输出 Sample Output
1 2 3
1 3 2
题目描述 Description
给出数字n以及x和y,请输出数字1~n的所有排列,但要求排列中x必须在y的左边方向,其它的数位置随意。
读入整数n、x和y ( 1<=n<=10,x∈[1,n],y∈[1,n] )
输出描述 Output Description
每行n个用空格隔开的数,表示一个符合条件的排列。并且所有排列按字典序输出。
样例输入 Sample Input
3 1 2
样例输出 Sample Output
1 2 3
1 3 2
3 1 2
[解题思路]
可以对1~n的数进行全排序,对每个序列进行判断,我们需要一个函数get_index()来获得x和y在每个序列中的位置。若get_index(x) <get_ index(y),即x在y的左边,则符合输出。
[代码实现]
#include<iostream>
using namespace std;
int book[11];
int result[11];
int n,X,Y;
int get_index(int x)
{
for(int i=1;i<=n;i++)
if(result[i]==x)
return i;
return -1;
}
void print()
{
for(int i=1;i<=n;i++)
cout<<result[i]<<" ";
cout<<endl;
}
void dfs(int step)
{
if(step==n+1)
{
if(get_index(X)<get_index(Y)) // X在Y的前面
print();
return ;
}
for(int i=1;i<=n;i++)
{
if(!book[i])
{
book[i]=1;
result[step]=i;
dfs(step+1);
book[i]=0;
}
}
}
int main()
{
cin>>n>>X>>Y;
dfs(1);
return 0;
}