洛谷題解UVA524 素數環
一、題目
https://www.luogu.org/problemnew/show/UVA524
二、分析
例1:以n = 4為例。n = 4的排列有
1,2,3,4相鄰兩個數相加都是素數,符合題意 1,3,2,42和4相加不是素數,不符合題意 1,3,4,24和2相加不是素數,不符合題意 1,4,2,34和2相加不是素數,不符合題意 1,4,3,2相鄰兩個數相加都是素數,符合題意。
所以正確的答案為
1,2,3,4 1,4,3,2
例2:以n = 5為例。n = 5的排列有
1,2,3,4,54和5相加不是素數,不符合題意 1,2,3,5,?3和5相加不是素數,不符合題意 1,2,4,?2和4相加不是素數,不符合題意 1,2,5,3,?5和3相加不是素數,不符合題意 1,2,5,4,?5和4相加不是素數,不符合題意 1,3,?1和3相加不是素數,不符合題意 1,4,2,?4和2相加不是素數,不符合題意 1,5,?1和5相加不是素數,不符合題意
所以n=5時,沒有答案。
三、程式碼
#include<bits/stdc++.h> using namespace std; int n,i,cnt,a[100]; int prime[100]; bool visited[100]; //標記visited[i]是否被用過 void dfs(int pos) { for(int i=2; i<=n; i++) { if(!visited[i] && prime[a[pos-1] + i])//i沒有用過,且與上一個數的和為素數 { visited[i] = true;// 標記 a[pos]=i;// 儲存 if(pos == n)// 放完了n個數 { if(prime[a[pos] + 1]) //這是一個環,所以最後一個數和第一個數1相鄰 { for(int j=1;j<n;j++) { printf("%d ",a[j]); } printf("%d",a[n]);//這裡很噁心,行末不能有空格 printf("\n"); } } else { dfs(pos+1); } visited[i] = false;//回溯 } } } int main() { // 素數打表 prime[2]=prime[3]=prime[5]=prime[7]=prime[11]=prime[13]=prime[17]=prime[19]=prime[23]=prime[29]=prime[31]=1;//先處理一下素數 while(scanf("%d",&n) == 1) { cnt++; printf("Case %d:\n",cnt); a[1]=1;//第一個數是1 dfs(2);//從第二個數開始搜 cout << endl; } return 0; }
少兒程式設計、資訊學競賽諮詢請加微信307591841或QQ群581357582

資訊學競賽公眾號.jpg