搜索基础题。
虽然跟搜索图不同但是思想是一致的。
1.模拟(这里是搜索)
2.判断
3.具体要求。
这里是在每一个选项选择不同的数据也就是搜索的核心。(return!)然后判断是否符合要求,也就是和前一个数字和为素数这里由于数字不超过20,所以先预处理一下,用素数筛打表以内所有合数。最后判断不要忘记最后一个数要跟第一个数符合条件。最后在符合条件的情况输出答案即可。
几个注意点:
1.return后清理vis
2.输出记得要改变case值以及空行别由于这个pe
#include<iostream>
#include<stdio.h>
using namespace std;
#include<cstring>
#include<cmath>
int prime[45],path[25],vis[25];
int n;
void pre()
{
memset(prime,0,sizeof(prime));
for(int i=2;i<=sqrt(40);i++)
{
if(!prime[i])
for(int j=i*i;j<=40;j+=i)
prime[j]=1;
}
}
void dfs(int k)
{
if(k==n+1&&!prime[path[k-1]+1])
{cout<<"1";
for(int i=2;i<=n;i++)
cout<<" "<<path[i];
cout<<endl;
return;}
int i;
for(i=2;i<=n;i++)
{
if(!vis[i]&&!prime[path[k-1]+i])
{
path[k]=i;
vis[i]=1;
dfs(k+1);
vis[i]=0;
}
}
return ;
}
int main()
{
pre();
int ca=0;
while(~scanf("%d",&n))
{ca++;
memset(path,0,sizeof(path));
memset(vis,0,sizeof(vis));
vis[1]=1;path[1]=1;
printf("Case %d:\n",ca);
dfs(2);
cout<<endl;
}
}