版权声明:转载请注明出处:https://blog.csdn.net/qq1013459920 https://blog.csdn.net/qq1013459920/article/details/83443855
Prime Ring Problem题目链接
题目意思:
一个圆环,要求首尾两个元素之和为素数,所有相邻元素之和为素数。
按字典序输出所有符合素数环的情况(每个点都需要记录)
思路:暴力深搜+判断素数
AC Code:
#include<iostream>
#include<sstream>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<map>
#include<vector>
#include<stack>
#include<queue>
#include<set>
#include<list>
#define mod 998244353
#define INF 0x3f3f3f3f
#define Min 0xc0c0c0c0
#define mst(a) memset(a,0,sizeof(a))
#define f(i,a,b) for(int i = a; i < b; i++)
using namespace std;
typedef long long ll;
const int MAX_N = 25;
bool vis[MAX_N];
int arr[MAX_N];
bool is_prime(int x){
if(x == 1){
return false;
}
if(x == 2){
return true;
}
if(x % 2 == 0){
return false;
}
for(int i = 3; i <= (int)sqrt(x); i += 2){
if(x % i == 0){
return false;
}
}
return true;
}
void dfs(int step, int n){
if(step > n && is_prime(arr[1] + arr[n])){
for(int i = 1; i < n; i++){
cout<<arr[i]<<" ";
}
cout<<arr[n]<<endl;
}
for(int i = 2; i <= n; i++){
arr[step] = i;
if(is_prime(arr[step] + arr[step - 1]) && !vis[i]){
vis[i] = 1;
dfs(step + 1, n);
vis[i] = 0;
}
}
}
int main(){
int cas = 1, n;
while(cin>>n){
printf("Case %d:\n", cas++);
mst(vis);
mst(arr);
arr[1] = 1;
dfs(2, n);
cout<<endl;
}
return 0;
}