题目描述
假设有从 1 到 N 的 N 个整数,如果从这 N 个数字中成功构造出一个数组,使得数组的第 i 位 (1 <= i <= N) 满足如下两个条件中的一个,我们就称这个数组为一个优美的排列。条件:
I. 第 i 位的数字能被 i 整除
II. i 能被第 i 位上的数字整除
现在输入一个整数 N,请问可以构造多少个优美的排列?
输入
输入样例由多组测试数据组成。每组测试数据第一行输入一个正整数 N ( 1 <= N <= 15 )
输出
输出可以构造的优美的排列的数量
样例输入
2
样例输出
2
总结:这题的思路跟那题排列差不多,相同的思路做我觉得都是没有问题,还是用DFS写
代码 (DFS)
#include<bits/stdc++.h>
using namespace std;
bool vis[20];
int n,ans;
bool judge(int x,int y){
if((x%y==0||y%x==0)&&!vis[y]) return true;
return false;
}
void dfs(vector<int>& q,int z){
if(q.size()==n){
ans++;
return;
}
for(int i=1;i<=n;i++){
if(judge(q.size()+1,i)){
vis[i]=1;
q.push_back(i);
dfs(q,z+1);
q.pop_back();
vis[i]=0;
}
}
return;
}
int main(){
while(cin>>n){
ans=0;
memset(vis,0,sizeof(vis));
vector<int>s;
dfs(s,0);
cout<<ans<<endl;
}
return 0;
}