标签:
4
2
大意:回溯,要会写dfs得到全排列
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int maxn = 66666; int vis[maxn]; int a[maxn]; void dfs(int step) { if(step == n + 1){ for(int i = 1; i <= n; i++) printf("%d",a[i]); return ; } else { for(int i = 1; i <= n ; i++){ if(!vis[i]){ vis[i] = 1; a[step] = i; dfs(step+1); vis[i] = 0; } } } }
AC代码
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int maxn = 666666; int vis[maxn]; int n,cout; int a[maxn]; int prim(int n){ int i; for( i = 2; i*i <= n ;i++){ if(n%i == 0) break; } if(i*i > n) return 1; return 0; } void dfs(int step) { if(step == n+1){ int i; //for(int j = 1; j <= n ;j++) // printf("%d",a[j]); // puts(""); for( i = 1; i <= n ;i++){ int x = a[i],y = a[i+1]; if(i == n){ y = a[1]; } if(prim(x+y) == 0){ break; } } if(i > n) { //for(int i = 1; i <= n ;i++) // printf("%d",a[i]); // puts(""); // printf("%d %d\n",a[4]+a[5],prim(a[4]+a[5])); cout++; } } for(int i = 2; i <= n ; i++){ if(!vis[i]){ vis[i] = 1; a[step] = i; dfs(step+1); vis[i] = 0; } } } int main() { a[1] = 1; while(~scanf("%d",&n)){ if(n%2 == 1) printf("0\n"); else { cout = 0; dfs(2); printf("%d\n",cout); } } return 0; }
标签:
原文地址:http://www.cnblogs.com/zero-begin/p/4514972.html