标签:回溯法
1.题目描述:点击打开链接
2.解题思路:本题利用回溯法解决。首先生成2*n范围内的所有素数,便于后续的判断。接下来试着填写每一位,如果数字i满足没有用过且它与前一项之和是素数,那么就可以用它,同时标记它已使用,递归寻找cur+1,退出时清除使用标记。
3.代码:
#define _CRT_SECURE_NO_WARNINGS #include<iostream> #include<algorithm> #include<string> #include<sstream> #include<set> #include<vector> #include<stack> #include<map> #include<queue> #include<deque> #include<cstdlib> #include<cstdio> #include<cstring> #include<cmath> #include<ctime> #include<functional> using namespace std; #define N 20 int vis[2*N],A[N],flag[N]; int n; void init()//生成素数 { int m = sqrt(2*N + 0.5); for (int i = 2; i <= m;i++) for (int j = i*i; j < 2 * N; j += i) if (!vis[j]) vis[j] = 1; } void dfs(int cur) { if (cur == n&&!vis[A[0] + A[n - 1]]) { for (int i = 0; i < n; i++) printf("%d%c", A[i], i == n - 1 ? '\n' : ' '); } else for (int i = 2; i <= n;i++) if (!flag[i] && !vis[i + A[cur - 1]]) { A[cur] = i; flag[i] = 1;//设置使用标志 dfs(cur + 1); flag[i] = 0;//清除使用标志 } } int main() { //freopen("t.txt", "r", stdin); int rnd = 0; init(); while (~scanf("%d", &n)) { if (rnd)cout << endl; printf("Case %d:\n", ++rnd); memset(A, 0, sizeof(A)); A[0] = 1; memset(flag, 0, sizeof(flag)); dfs(1); } return 0; }
标签:回溯法
原文地址:http://blog.csdn.net/u014800748/article/details/44891077