zoukankan      html  css  js  c++  java
  • cogs 66. [HAOI2004模拟] 数列问题

    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<cstring>
    #include<iostream>
    #include<algorithm>
    using namespace std;
    int n,tot;
    int num[16],vis[16],yes[30];
    void judge(){
        yes[2]=1;yes[3]=1;yes[5]=1;
        yes[7]=1;yes[11]=1;yes[13]=1;
        yes[17]=1;yes[19]=1;yes[23]=1;yes[29]=1;
    }
    void dfs(int pos){
        if(pos==n+1){
            for(int i=1;i<n;i++)
                if(yes[num[i]+num[i+1]]==0)    return;
            tot++;
            for(int i=1;i<=n;i++)    cout<<num[i]<<" ";
            cout<<endl;
        }
        for(int i=1;i<=n;i++)
            if(!vis[i]){
                vis[i]=1;
                num[pos]=i;
                dfs(pos+1);
                vis[i]=0;
            }
    }
    int main(){
        freopen("dfs3.in","r",stdin);
        freopen("dfs3.out","w",stdout);
        scanf("%d",&n);
        judge();dfs(1);
        cout<<tot;
    }

     优化

    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    using namespace std;
    int n,tot;
    int num[16],vis[16],yes[30];
    void judge(){
        yes[2]=1;yes[3]=1;yes[5]=1;
        yes[7]=1;yes[11]=1;yes[13]=1;
        yes[17]=1;yes[19]=1;yes[23]=1;yes[29]=1;
    }
    void dfs(int pos){
        if(pos==n+1){
            tot++;
            for(int i=1;i<=n;i++)    cout<<num[i]<<" ";
            cout<<endl;
            return ;
        }
        for(int i=1;i<=n;i++)
            if(!vis[i]&&(yes[i+num[pos-1]]||pos==1)){
                vis[i]=1;
                num[pos]=i;
                dfs(pos+1);
                vis[i]=0;
            }
    }
    int main(){
        freopen("dfs3.in","r",stdin);
        freopen("dfs3.out","w",stdout);
        scanf("%d",&n);
        judge();dfs(1);
        cout<<tot;
    }
    细雨斜风作晓寒。淡烟疏柳媚晴滩。入淮清洛渐漫漫。 雪沫乳花浮午盏,蓼茸蒿笋试春盘。人间有味是清欢。
  • 相关阅读:
    更新的OPENCV资料
    单通道图像的直方图(C/C++源代码)
    Java2下Applet数字签名具体实现方法
    采用HVS的图像相似度准则计算WPSNR
    彩色图像分割的FLOOD FILL方法(源代码)
    数字图像的直方图均衡化(C/C++源代码)
    彩色图像分割的FLOOD FILL方法(源代码)
    14、C++ Primer 4th 笔记,迭代器
    16、C++ Primer 4th 笔记,static(静态)类成员
    12、C++ Primer 4th 笔记,关联容器(2)
  • 原文地址:https://www.cnblogs.com/cangT-Tlan/p/9609989.html
Copyright © 2011-2022 走看看