1. 程式人生 > >hdu1016 深搜回溯

hdu1016 深搜回溯

水題    上程式碼
#include<stdio.h>
int n;
int s[21];
int vis[21];
int isprime(int n)
{
	int count=0;
	for(int i=2;i<=n-1;i++)
	if(n%i!=0) count++;
	if(count==n-2)
	return 1;
	return 0;
}
void dfs(int j)
{
	if(j==n&&isprime(s[n-1]+1))
	{
	for(int i=0;i<n;i++) {
	if(i==0) printf("1");
	else printf(" %d",s[i]);}
	printf("\n"); 
    }
    for(int i=2;i<=n;i++)
    {
    if(isprime(s[j-1]+i)&&vis[i]==0)
    {
	s[j]=i;
	vis[i]=1;
	dfs(j+1);
	vis[i]=0;//回溯框架; 
    }
    }
}
int main()
{
	int count=0;
	while(scanf("%d",&n)!=EOF)
	{
		printf("Case %d:\n",++count);
		s[0]=1;
		dfs(1);
		printf("\n");
	}
	return 0;
}