HDU 1016 Prime Ring Problem(深搜)

题目链接:HDU 1016 Prime Ring Problem

HDU 1016	Prime Ring Problem(深搜)
HDU 1016	Prime Ring Problem(深搜)
有n个位置,有n个数,第一个位置放1,求剩下位置满足条件(相邻和为素数)的一个全排列。

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<string>
#include<cstring>
#include<cmath>
const int maxn = 25; 
using namespace std;
int a[maxn];	//记录每个位置上的数字 
int vis[maxn];
int n;

int pd(int x, int y)	//判断两个数的和是否为素数 
{
	int tmp = x+y;
	if(tmp<2)
		return 0;
	
	for(int i=2;i*i<=tmp;i++)
		if(tmp%i==0)
			return 0;
	return 1;	
}

void print()	//打印 
{
	printf("%d",a[1]);
	for(int i=2;i<=n;i++)
		printf(" %d",a[i]);
	printf("\n");
}

void search(int t)	//第一个位置固定放1, 所以从第二个位置开始,遍历2~n位置 
{
	for(int i=2;i<=n;i++)	//有 2~n个数可选 
	{
		if(pd(a[t-1],i)&&vis[i]==0)		//判断与前一个数是否构成素数及该数是否可用 
		{
			a[t] = i;
			vis[i] = 1;	//标记为已使用
			
			if(t==n)
			{
				if(pd(a[n],a[1]))
					print();
			}
			else
			{
				search(t+1);	//寻找下一个位置 
			}
			
			vis[i] = 0; 
		}	
	}
}




int main()
{
	int cnt = 0;
	while(cin>>n)
	{
		memset(vis,0,sizeof(vis));
		a[1] = 1;
		printf("Case %d:\n",++cnt);
		search(2);	//从第二个位置开始 
		printf("\n");	//每个样例之间有个空行
	}
}