单点时限: 2.0 sec
内存限制: 256 MB
在书架上放有编号为 1,2,…,n 的 n 本书。现将 n 本书全部取下然后再放回去,当放回去时要求每本书都不能放在原来的位置上。
例如 n=3 时:原来位置为:1,2,3。放回去时只能为:3,1,2 或 2,3,1 这两种。
对于每一个 n,求满足上面的条件的放法有多少?
输入格式
第 1 行为一个整数 T (0≤T≤10),表示有T$ 组测试数据。
接下来 T 行,每行一个数 n (0≤n≤10),表示有 n 本书。
输出格式
对于每组测试数据,如果 n<8,输出每种放法(每种放法占一行,放法按照字典序从小到大排列),如果 n≥8,只需要输出放法总数。
样例
input
2
3
8
output
231
312
14833
提示
算法作业:回溯。
/*
思路:全排列问题。
使用next_permutaion()更便捷
*/
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int n;
vector<int>v;
int flag[11]= {0};
int ans=0;
void dfs(int i) {
if(i==n+1) {
ans++;
if(n<8) {
for(int j = 0; j < v.size(); j++)
cout<<v[j];
cout<<endl;
}
return;
}
for(int j = 1; j <= n; j++) {
if(flag[j]==0&&i!=j) {
flag[j]=1;
v.push_back(j);
dfs(i+1);
flag[j]=0;
v.pop_back();
}
}
}
int main() {
int t;
cin>>t;
while(t--) {
cin>>n;
ans=0;
dfs(1);
if(n>=8)
cout<<ans<<endl;
}
return 0;
}