杭电ACM_1016_素数环
生活随笔
收集整理的這篇文章主要介紹了
杭电ACM_1016_素数环
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目鏈接:
http://acm.hdu.edu.cn/showproblem.php?pid=1016
(經典的剪枝搜索)
題意:
就是求1~n的一個環(首尾銜接,順序打亂),使得相鄰的兩個元素之和為一個素數
題解1:
用C++中得STL生成全排列,超時!!!!
#include <cstdio> #include <algorithm> using namespace std; int A[30]; bool prime[50]; bool is_prime(int n) { for (int i = 2; i*i <= n; i++) { if (!(n % i)) { return 0; } } return 1; } int main() { //freopen("input.txt","r",stdin); for (int i = 0; i < 50; i++) { prime[i] = is_prime(i); } int N; int nCase = 0; while (~scanf("%d",&N)) { printf("Case %d:\n",++nCase); for (int i = 0; i < N; i++) A[i] = i+1; do { int ok = 1; for (int i = 0; i < N-1; i++) { if (!prime[A[i] + A[i+1]]) { ok = 0; break; } } if (ok && prime[A[0]+A[N-1]]) { printf("%d",A[0]); for (int i = 1; i < N; i++) { printf(" %d",A[i]); } printf("\n"); } } while (next_permutation(A+1,A+N)); printf("\n"); } }解法2:
遞歸搜索(+剪枝)
(一個PE搞了我好半天,本以為這個題跟Uva的一模一樣......
Uva原文鏈接:
http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=24&page=show_problem&problem=465)
#include <cstdio> #include <cstring> using namespace std; bool vis[50],prime[50]; bool is_prime(int n) { for (int i = 2; i*i <= n; i++) if (!(n % i)) return 0; return 1; } void init() { for (int i = 0; i < 50; i++) prime[i] = is_prime(i); } void dfs(int *A,int cur,int n) { if (cur == n && prime[A[0] + A[n-1]]) { printf("%d",A[0]); for (int i = 1; i < n; i++) printf(" %d",A[i]); printf("\n"); } else { for (int i = 2; i <= n; i++) { if (!vis[i] && prime[i + A[cur-1]]) { A[cur] = i;//嘗試在*A中填入各種數 vis[i] = 1; dfs(A,cur+1,n); vis[i] = 0;//記得一定得改回來(回溯常用技巧!!!) } } } } int main() { init(); // freopen("input.txt","r",stdin); memset(vis,0,sizeof(vis)); int A[30] = {1}; int N; int nCase = 1; while (~scanf("%d",&N)) { /* if (nCase > 1) printf("\n"); */ printf("Case %d:\n",nCase++); dfs(A,1,N); printf("\n");//如果是Uva上的素數環的話,就用上面的/*if (nCase > 1) printf("\n");*/ } }轉載于:https://blog.51cto.com/zhujifang/1380277
總結
以上是生活随笔為你收集整理的杭电ACM_1016_素数环的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Server 2008 Core/服务器
- 下一篇: ubuntu不显示壁纸,桌面右键无反应