/*
題目大意:輸入一個數字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;
}
UVA - 524 - Prime Ring Problem
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.