#include<iostream>
#include<algorithm>
using namespace std;
const int maxn = 20;
int arr[maxn]; //这n个数字有哪几个 如1 2 3
int vis[maxn]; //判断这个数字是否被使用
int n;//表示有n个数 比如有3个数字
int stc[maxn];//保存排列的结果,这是个栈
int top;//栈顶
void init(){ //vis 初始化全为1,表示没被使用
for(int i = 0 ; i < maxn ; ++i){
vis[i] = 1;
}
}
void dfs(int ith){//ith表示找到当前一组排列的第几个数
if(ith == n){ //相等就表示找到
/*
如果找到一组排列就返回,一组排列肯定为n个数字,
ith与n个数相等时,表示找到一组排列
*/
//找到就输出
for(int i = 0 ; i < n ; ++i){
cout<<stc[i];
}
cout<<endl;
return;
}
//如果没找到,就dfs+回溯
for(int i = 0 ; i < n ; ++i){
if(vis[i] == 1){ //表示没有使用
vis[i] = 0;//到了这个if就表示使用了,就置为0,表示使用过了
//结果保存,栈增加让下一个栈空间继续保存
stc[top++] = arr[i];
dfs(ith+1);//找下一个数字
//回溯状态,因为dfs已经开始找下一个状态,下一个状态中,这个vis肯定没有使用
//使用过的vis是当前状态的,不是下一状态,下一状态肯定为1
top--;//还是因为回溯,这个栈空间在下一个状态肯定是没使用
vis[i] = 1;
}
}
}
int main(){
while(cin >> n){
for(int i = 0 ; i < n ; i++){
cin >> arr[i];
}
top = 0;//初始时栈为空
init();
dfs(0);//从0开始,说明ith长度为0,开始找排列
}
return 0;
}