有乙個整數n,把從1到n的數字無重複的排列成環,且使每相鄰兩個數(包括首尾)的和都為素數,稱為素數環。
為了簡便起見,我們規定每個素數環都從1開始。
輸入 有多組測試資料,每組輸入乙個n(0輸出 每組第一行輸出對應的case序號,從1開始。樣例輸入如果存在滿足題意敘述的素數環,從小到大輸出。 否則輸出no answer。
683
0
樣例輸出
case 1:
1 4 3 2 5 6
1 6 5 2 3 4
case 2:
1 2 3 8 5 6 7 4
1 2 5 8 3 4 7 6
1 4 7 6 5 8 3 2
1 6 7 4 3 8 5 2
case 3:
no answer
思路
如果是1開頭,那麼結尾的那個數必須是偶數。
假設n是乙個奇數,n≥3
從1 到 n 排列,奇數個數=偶數個數 + 1
第一位排奇數1,最後乙個排乙個偶數。在中間的數字裡,偶數必須和兩個奇數相隔,那麼最後剩下了乙個奇數,不符合要求。因此,n≥3時,n必為偶數。
特判:n=1成立(自己和自己成環),n=2成立,n=3不成立
在此基礎上,再對一串數字進行dfs操作,即找到滿足條件的數的組合為止。
**
#include using namespace std;
int a[45]=,b[21]=,v[21]=,n;
void init()
}void dfs(int x)
for(j=2;j<=x;j++)
if(!a[b[j-1]+b[j-2] ])
return ;
if(x==n)
{if(a[b[0] +b[x-1] ])
{for(j=0; j>n)
{ if (n==0)
break;
t++;
cout<<"case "<**來自:
素數環問題
問題描述 用自然數1到20構成乙個素數環,環中的每個元素與其相鄰元素的和都構成素數。請程式設計實現並輸出這個環 這裡採用了遞迴策略,可以輸出所有情況,不過存在重複輸出問題,重複輸出數為n,環是沒有次序的 現在沒有想到好的解決方法。若自然數個數確定為20 則構環的數目相當大,程式執行時間也高得驚人。測...
素數環問題
素數環 時間限制 1000 ms 記憶體限制 65535 kb 難度 2 描述 有乙個整數n,把從1到n的數字無重複的排列成環,且使每相鄰兩個數 包括首尾 的和都為素數,稱為素數環。為了簡便起見,我們規定每個素數環都從1開始。例如,下圖就是6的乙個素數環。輸入 有多組測試資料,每組輸入乙個n 0 n...
素數環問題
把從1到20這20個數擺成乙個環,要求相鄰的兩個數的和是乙個素數。c include include include using namespace std 列印結果 void printsolution const vector v cout bool check1 const vector v,...