2912. 放书

单点时限: 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;
}
发布了45 篇原创文章 · 获赞 21 · 访问量 487

猜你喜欢

转载自blog.csdn.net/qq_40394960/article/details/105120618