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