[HAOI2004模拟] 数列问题

来源:互联网 发布:锁定windows快捷键 编辑:程序博客网 时间:2024/04/29 08:47

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;}


原创粉丝点击