hdu1016 Prime Ring Problem

1.筛法打素数表,先进行预处理

2.进行枚举,同时递归的时候标记数组,当找到最后一个数同时第一个数和最后一个数相加也是素数,进行输出。

int visited[21], a[21];
bool is_prime[100];
int n;
void sieve()
{
	for (int i = 0; i <= 40; i++)
		is_prime[i] = true;
	is_prime[0] = is_prime[1] = false;
	for (int i = 2; i <= 40; i++)
	{
		if (is_prime[i])
		{
			for (int j = 2 * i; j <= 40; j += i)
				is_prime[j] = false;
		}
	}
}

void dfs(int num)
{
	if (num == n && is_prime[a[num] + a[1]])
	{
		for (int i = 1; i < num; i++)
		{
			printf("%d ", a[i]);
		}
		printf("%d\n", a[num]);
	}
	else
	{
		for (int i = 2; i <= n; i++)
		{
			if (visited[i] == 0)
			{
				if (is_prime[a[num] + i])
				{
					a[++num] = i;
					visited[i] = -1;
					dfs(num);
					visited[i] = 0;
					num--;
				}
			}
		}
	}
}
int main()
{
	int t = 0;
	sieve();
	while (scanf("%d", &n) != EOF)
	{
		t++;
		printf("Case %d:\n", t);
		memset(visited, 0, sizeof(visited));
		memset(a, 0, sizeof(a));
		a[1] = 1;
		dfs(1);
		printf("\n");
	}
	return 0;
}

  

posted @ 2017-02-28 18:59  web之路  阅读(80)  评论(0编辑  收藏  举报