1.题目链接:
http://acm.hdu.edu.cn/showproblem.php?pid=1016
2.思路:
这题就是求素数环(所谓素数环就是相邻的两个数的和是素数,然后构成一个环,开始的数是从1开始的),使用深搜算法(DFS)。
3.参考代码:
#include <iostream>
#include <stdio.h>
using namespace std;
int n,count; ///count是计数器
int map[21]={1},vis[21]={0}; ///vis标记是否访问过,初始化为0表示没有访问的
int isp[]={0,0,1,1,0,1,0,1,0,0,0,1,0,1,0,0,0,1,0,1,0,0,0,1,0,0,0,0,0,
1,0,1,0,0,0,0,0,1,0,0,0,1,0,1,0,0,0,1,0,0,0};
///使用打表的方法,提高判断速度
void dfs(int n,int cur){
int i;
if(cur==n && isp[map[0]+map[n-1]]) ///如果当前位置刚好到最后一个值,
///并且首位相加为素数
{
for(i=0;i<n-1;i++)
cout<<map[i]<<" ";
cout<<map[i]; ///注意格式,最后一个数是没有空格的
cout<<endl;
}
else
{
for(i=2;i<=n;i++) ///从第二个数开始遍历
{
if(!vis[i] && isp[i+map[cur-1]]) ///如果没有被访问过,
///并且当前这个数与前一个数的和是素数的话
{
map[cur]=i; ///将当前这个数放入素数环
vis[i]=1; ///标记为已访问的
dfs(n,cur+1); ///搜索下一个点
vis[i]=0; ///回溯
}
}
}
}
int main()
{
while(cin>>n)
{
printf("Case %d:\n",++count);
dfs(n,1);
cout<<endl; ///两个结果之间有一个换行
}
return 0;
}