include [HTML_REMOVED]
include [HTML_REMOVED]
include [HTML_REMOVED]
using namespace std;
int n;
//u表示当前到达第几层了,也表示当前在看数字的第几位,这里的第几位是日常话语
//的第几位减1,是从0开始的
const int N = 10;
int path[N];
//path[u]表示第u位的数值
int sk[N]={false,};
//sk数组记录每个数字有没有被写过,写了就为true
void dfs(int u)
{
if(u == n)
{//u==n表示看第n位,超出了数字长度,到达叶子节点了
for (int i = 0; i < n; i ++ )
{
printf(“%d “,path[i]);
}
printf(“\n”);
return;
}
if(u<n)
{
//眼光着眼于某个节点的某一位,从1到n遍历,看看哪个数还没有被写入过
for (int i = 1; i <= n; i ++ )
{
if(sk[i]==false)
{
//false表示i没有被填入过,i后面的更没有填入过,那就填i
path[u] = i;
sk[i] = true;
dfs(u+1);
//如过还没到叶子节点,这个递归就会一直执行
//恢复现场就一直没做path[u]和sk[i]就一直有效
//直到叶子节点里面的return;然后才会执行上一层的恢复现场
//直到u的下一层的return;执行后,u这一层才做恢复现场操作
//恢复现场
path[u] = 0;
sk[i] = false;
}
}
}
}
int main()
{
cin >> n;
dfs(0);
return 0;
}