UVA - 524 - Prime Ring Problem

題目傳送門

/*
	題目大意:輸入一個數字n,構造一個1~n的素數環——即前後兩個數相加爲素數的環
	這裏我們也是採用回溯的方法
*/
#include <iostream>
#include <stdio.h>
#include <algorithm>
#define MAXN 36//最大的n爲16,則素數相加最大隻會爲32
using namespace std;
bool isp[MAXN];//離線素數
bool book[MAXN];//標記數組
int arge[MAXN];//存儲數字
int n;
bool is_primer(int x)
{//離線完成素數環
	int i;

	for (i = 2; i*i <= x; i++)
		if (x%i == 0)
			return false;
	return true;
}
void dfs(int cur)
{//深搜框架
	if (cur == n&&isp[1+arge[n-1]])
	{//注意:對於素數環的首位相加也要是素數才行
		for (int i = 0; i < n; i++)
			if (i)//保證尾行無空格
				printf(" %d", arge[i]);
			else
				printf("%d", arge[i]);
		putchar('\n');
	}
	else
	{
		for (int i = 2; i<=n; i++)//從第二個數開始嘗試
			if (!book[i] && isp[i + arge[cur - 1]])
			{//如果這個數沒有被使用過,並且他和前一個數的和是素數,那就進入遞歸
				arge[cur] = i;//在該位置記錄這個數
				book[i] = true;//該數正在被使用
				dfs(cur + 1);//進入下一層遞歸
				book[i] = false;//該數的使用結束
			}
	}
}
int main(void)
{
	for (int i = 2; i <= MAXN; i++)
		if (is_primer(i))
			isp[i] = true;//離線素數
	arge[0] = 1;//題目規定了從整數1開始逆時針旋轉,所以第一個數絕對是1
	int k = 1;//格式控制
	while (scanf("%d", &n) != EOF)
	{
		if (k != 1)
			putchar('\n');//格式控制
		printf("Case %d:\n", k++);
		dfs(1);
	}

	return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章