2 条题解
-
2
#include <bits/stdc++.h> using namespace std; int n, ans[20]; bool hashx[20]; int prime[] = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41}; bool isPrime(int x) { for(int i = 0; i < 13; i++) { if(prime[i] == x)return true; } return false; } void checkAndPrint() { //检查输出由回溯法枚举得到的解 if(! isPrime(ans[n] + ans[1]))return; //判断最后一个数与第一个数是否为素数,若不是则直接返回 for(int i = 1; i <= n; i++) { printf("%d%s", ans[i], i == n ? "\n" : " "); } } void DFS(int num) { //num为环中的个数 if(num > 1) if(!isPrime(ans[num] + ans[num - 1])) return; //如果不是素数,则返回 if(num == n) { checkAndPrint(); //输出结果 return; } for(int i = 2; i <= n; i++) { if(!hashx[i]) { //没有被放入 hashx[i] =true; ans[num + 1] = i; DFS(num + 1); //继续尝试放入下一个 hashx[i] = false; //回溯后,重新标记为未使用 } } } int main() { int casex = 0; while(cin>>n) { casex++; for(int i = 0; i < 22; i++)hashx[i] = false; ans[1] = 1; printf("Case %d:\n", casex); hashx[1] = true; //标记1已经被使用 DFS(1); } return 0; }
-
1
#include <bits/stdc++.h> using namespace std; int sum,n,ans[10001]; bool flag[10001],isprime[41]; void get_prime() { memset(isprime, true, sizeof(isprime)); isprime[0] = isprime[1] = false; for (int i = 2; i < 41; i++) { if (isprime[i]) { for (int j = i * 2; j < 41; j += i) { isprime[j] = false; } } } } void f(int x) { if(x==n+1 && ans[1]==1) { if(isprime[ans[1]+ans[n]]) { for(int i=1;i<n;i++) { cout<<ans[i]<<' '; } cout<<ans[n]<<endl; } return; } else { for(int i=2;i<=n;i++) { if(flag[i]==false && (i==1 || isprime[i+ans[x-1]])) { flag[i]=true; ans[x]=i; f(x+1); ans[x]=0; flag[i]=false; } } } } int main() { get_prime(); while(cin>>n) { if(sum>=1)cout<<endl; memset(flag,0,sizeof(flag)); sum++; cout<<"Case "<<sum<<":"<<endl; flag[1]=1; ans[1]=1; f(2); } return 0; }
给个赞吧ヾ(≧▽≦*)o
- 1
信息
- ID
- 1913
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 4
- 标签
- 递交数
- 86
- 已通过
- 38
- 上传者