HDU1016 dfs

时间:2023-03-09 09:05:54
HDU1016 dfs

刷回溯的时候发现我对DFS思路很不清晰,总是做着做着就乱了,刷个水题找找思路。

题意:经典DFS,找出所有的能让1~n的数形成素数环的序列(相邻相加为素数);

 #include <iostream>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <string>
#include <sstream>
#include <algorithm>
#define Max 2147483647
#define INF 0x7fffffff
#define ll long long
#define mem(a,b) memset(a,b,sizeof(a))
#define repu(i, a, b) for(int i = (a); i < (b); i++)
const double PI=-acos(-1.0);
#define N 10010
using namespace std;
bool pri[N];
int p[N];
int prim()
{
memset(pri, true, sizeof(pri));
for(int i = ; i <= sqrt( +0.5); i++)
if(pri[i])
for(int j = i << ; j <= N; j += i)
pri[j] = false;
}
int n;
bool vis[N];
void dfs(int pos,int m)///p[pos-1] = m
{
if(pos == n+ && pri[p[n]+])
{
repu(i,,n)
printf("%d ",p[i]);
printf("%d\n",p[n]);
return ;
}
int i = ;
repu(i,,n+)
{
if(pri[m + i] && !vis[i] )///符合条件
{
vis[i] = ;
p[pos] = i;
dfs(pos+,p[pos]);
vis[i] = ;
}
}
}
int main()
{
//init();
prim();
memset(vis,,sizeof(vis));
int kase = ;
while(~scanf("%d",&n))
{
printf("Case %d:\n",kase++);
p[] = ;
p[n+] = ;
dfs(,);
if(kase)
printf("\n");
}
return ;
}