日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

杭电ACM_1016_素数环

發布時間:2024/9/20 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 杭电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_素数环的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。