1020 Prime Ring Problem
题意:素数环,给出一个数N(0<N<20),在1~N的所有排列中,满足相邻两个数之和是素数(头尾相邻)的排列输出。
思路:1为第一个数,然后对其余的n-1个数搜索,直到最后一个数,最后把1和最后一个数进行判断,满足要求则输出。
感想:深搜,在这里把1到20,任意两个数的和中,为素数的初始化了,判断方便了许多。
#include<iostream>
#include<stdio.h>
using namespace std;
int g[42],a[21],b[21],n; //g[i]=1则i是素数,a保存成立的数列
//b[i]=0则已经在序列中,否则没有被使用
void dfs(int k,int m){
a[k]=m;
if(k==n){
if(g[1+m]==0) return ;
cout<<a[1];
for(int i=2;i<=n;i++)
cout<<" "<<a[i];
cout<<endl;
return ;
}
for(int i=2;i<=n;i++)
if(b[i]&&g[i+m]){
b[i]=0;
dfs(k+1,i);
b[i]=1;
}
}
int main(){
int i,j,k=1;
for(i=0;i<42;i++)
g[i]=0;
g[2]=g[3]=g[5]=g[7]=g[11]=g[13]=g[17]=g[19]=g[23]=g[29]=g[31]=g[37]=g[41]=1;
while(cin>>n){
for(i=0;i<=n;i++)
b[i]=1;
cout<<"Case"<<k++<<":"<<endl;
dfs(1,1);
cout<<endl;
}
return 0;
}