1016:Prime Ring Problem

来源:互联网 发布:淘宝内衣真人秀图片 编辑:程序博客网 时间:2024/06/05 20:18

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1016

方法:回朔法,DFS

思路:素数环是DFS的经典入门题目,我也是第一次学习DFS,在这个题上耗费了很长时间,主要是由于一个参数设置的不对,结果dfs的循环一直跑不进去,郁闷啊,总之,这道题总算是AC了。言归正传,具体思路是,通过递归调用,不断地寻找符合条件的数字,通过递归其实也就是不断地生成解答树,而不断调用直到不能满足要求或是满足要求打印出结果为止,这就是搜索到某一搜索路径的最深处,也就是所谓的深度优先搜索。另外,由于要判断素数,而且数据也给定了范围,因此可以建立哈希表建立起素数的对应关系,这样的预处理可以快速判断素数,这个经验应当牢记。

难点:dfs的写法

#include <iostream>#include<cstdio>#include<string.h>using namespace std;int isp[50];int ans[30] = {0,1};int visit[30] = {0};int n;int cas = 1;int prime(){    for(int i = 2;i < 50;i++)    {        int ok = 0;        for(int j = 2;j < i;j++)        {            if((i%j == 0))            {                 ok = 1;                 break;            }        }        if(ok != 1) isp[i] = 1;    }    return 0;}void dfs(int pos){    if(pos==n&&isp[1+ans[n]] == 1)    {        cout<<"1";        for(int i = 2;i <= n;i++)            cout<<" "<<ans[i];        cout<<endl;    }    for(int j = 2;j <= n;j++)    {        if(!visit[j]&&isp[j+ans[pos]])        {            ans[pos+1] = j;            visit[j] = 1;            dfs(pos+1);            visit[j] = 0;        }    }}int main(){    int i;    prime();   //for(i = 0;i < 50;i++)   // cout<<isp[i]<<" ";    int time = 1;    while(cin>>n)    {        cout<<"Case "<<time++<<":"<<endl;        dfs(1);        cout<<endl;    }}


0 0
原创粉丝点击