一切见注释。
#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;
}
hdu 1016 Prime Ring Problem (dfs),布布扣,bubuko.com
hdu 1016 Prime Ring Problem (dfs)
原文地址:http://blog.csdn.net/u010709592/article/details/27410779