首页 > 代码库 > hdu 1016 Prime Ring Problem (dfs)
hdu 1016 Prime Ring Problem (dfs)
一切见注释。
#include <cstdio> #include <iostream> #include <cstring> #include <algorithm> using namespace std; bool vis[22]; int n; int ans[22]; int top; bool isprime(int x)//判断素数 { for(int i=2;i<x;i++) if(x%i==0)return false; return true; } void dfs(int pos) { if(pos==n)//如果已经把环填满 也就是所有的数和前一个数的和是素数 {//那么我们就判断最后一个数和第一个数的和是不是素数 if(isprime(ans[n-1]+1))//如果是 输出方案 { for(int i=0;i<n;i++) printf("%d%c",ans[i],i==n-1?'\n':' '); } return ;//如果不是 返回 } for(int i=1;i<=n;i++)//枚举这个位置放的数 { if(vis[i])continue;//如果这个数已经放过 if(!isprime(i+ans[pos-1]))continue;//如果你要尝试加入的这个数和上一个数的和不是素数 就不加进去 vis[i]=true;//如果以上条件都不符合 那么就可以加入到这个位置 标记为已经放入 ans[pos]=i;//放入方案中 dfs(pos+1);//递归下一次 去下一个位置尝试放数 vis[i]=false;//把这个数拿出来 尝试另外一种方案 } } int main() { int CASE=1; while(scanf("%d",&n)!=EOF) { top=0; ans[0]=1;//把 1 放入第一个位置 vis[1]=true;//把 1 标记为已经放入环中 printf("Case %d:\n",CASE++);//输出CASE dfs(1);//进入递归 puts("");//输出换行 } return 0; }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。