简单题意
输入正整数n,把整数1,2,3。。。n组成一个环,使得相邻两个整数的和均为素数,输出时从整数1开始逆时针排列。同一个环应恰好输出一次
解题思路形成过程
这个题在算法书上紧跟N皇后问题,这两个题很接近,都是深搜,在当前情况下判断下一个是否符合情况,符合记录,否则继续搜索,直到得到符合条件的结果
AC代码
#include<iostream>
#include<string.h>
#include<fstream>
using namespace std;
int ans[25];//记录
bool f[25];//判断是否访问过
int n;
int isprime(int x){
for(int i=2;i<=x/2;i++){
if(x%i==0)return 0;
}
return 1;
}//判断素数
void dfs(int k,int now){
if(k==n){//到结尾
if(isprime(now+1)){//它与首位数字1相加是否为素数
ans[k]=now;
for(int i=0;i<n;i++){
printf("%d%c",ans[i],i==n-1?'\n':' ');
}
}
return;
}
for(int i=2;i<=n;i++){
if(!f[i]&&isprime(now+i)){//找相邻的相加为素数
f[i]=1;//用过做个记号
ans[k]=i;//存起来
dfs(k+1,i);//以此树为起点继续搜下一个
f[i]=0;
}
}
}
int main(){
ifstream cin("in.txt");
freopen("in.txt","r",stdin);
int cnt=1;
while(cin>>n){
printf("Case %d:\n",cnt++);
memset(f,0,sizeof(f));
ans[0]=1;
dfs(1,1);
cout<<endl;
}
return 0;
}