66. [HAOI2004模拟] 数列问题
★☆ 输入文件:dfs3.in
输出文件:
dfs3.out
简单对比
时间限制:1 s 内存限制:128 MB
问题描述
试编程将 1 至 N ( N ≤ 15 )的自然数序列 1 , 2 , … , N 重新排列,使任意相邻两数之和为素数。例如 N=3 时有两种排列方案 123 、 321 满足要求。
【输入格式】
输入文件:dfs3.in
第一行:一个整数n(1<=n<=15)
【输出格式】
输出文件:dfs3.out
输出若干行,每行为一种排列方案(排列方案按字典序排列, 相邻数字之间用空格分隔) ),最后一行输出排列方案总数。
【输入样例】
输入文件名:dfs3.in
3
输出文件名:dfs3.out
1 2 3
3 2 1
2
简单搜索。
#include<cstdio>
#include<cmath>
using namespace std;
int n,ans;
bool vis[20];
int a[20];
bool prim[50];
void get_prim(){
int i,j;
for(i=2;i<=30;i++){
for(j=2;j<=sqrt(i);j++)
if(i%j==0) break;
if(j>sqrt(i)){
prim[i]=true;
}
}
}
void dfs(int cur,int last){
if(cur==n+1){
ans++;
for(int i=1;i<n;i++) printf("%d ",a[i]);
printf("%d\n",a[n]);
return ;
}
for(int i=1;i<=n;i++){
if(!vis[i]&&prim[last+i]==true){
a[cur]=i;
vis[i]=true;
dfs(cur+1,i);
vis[i]=false;
}
}
}
int main(){
freopen("dfs3.in","r",stdin);
freopen("dfs3.out","w",stdout);
get_prim();
scanf("%d",&n);
for(int i=1;i<=n;i++){
vis[i]=true;
a[1]=i;
dfs(2,i);
vis[i]=false;
}
printf("%d\n",ans);
return 0;
}