杭电 1016题

//经典的深度优先搜索
#include <iostream>
using namespace std;
#define arraysize 21
int data[arraysize]; //存储结果
bool final[arraysize]; //标记该节点是否已经被搜索
//素数表,用于存储是否是素数,从0开始,1代表是素数
int primelist[38] = {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}; 
int n;
int casenum;
void DFS(int num)  //代表已经找到了num个数
{
 int i,j;
 if(num==n && primelist[data[n]+data[1]]) //注意判断最后一个数和第一个数是否仍为素数
 {
  for(i=1;i<n;++i)
   cout<<data[i]<<" ";  //此处注意输出格式,最后一个数不要添加空格
  cout<<data[n]<<endl;
  return;
 }
 else
 {
  for(i=2;i<=n;++i)
  {
   if(!final[i] && primelist[data[num]+i])
   {
    data[num+1] = i;
    final[i] = true;
    DFS(num+1);  //深度优先搜索
    final[i] = false; //此处别忘了进行恢复
   }
  }
 }
}
int main()
{
 //freopen("1.txt","r",stdin);
 while(cin>>n)
 {
  memset(final,0,sizeof(final));
  data[1] = 1;
  final[1] = true;
  cout<<"Case "<<++casenum<<":"<<endl;
  DFS(1);
  cout<<endl;
 }
 return 0;
}

posted @ 2010-05-04 13:26  北海小龙  阅读(646)  评论(1编辑  收藏  举报