UVa - 524 素数环

xiaoxiao2021-02-27  373

UVa-524 题意:要求把1,2,3,……,n排列,围成一个环,相邻两个数和为素数。以1为首,顺时针输出所有可能。 思路:A[0]=1,然后搜索下一个位置的数字,直到用完n个数字,注意判断第一个和最后一个数字和也为素数。题目很简单,但要理解回溯的思想。

#include<cstdio> #include<cstring> using namespace std; const int maxn = 35; int prime[maxn],A[20],vis[20]; int n; void dfs(int cur) { if(cur == n && !prime[A[cur-1]+A[0]]){ for(int i = 0; i < n-1; i++){ printf("%d ",A[i]); } printf("%d\n",A[n-1]); return; } else{ for(int i = 2; i <= n; i++){ if(!vis[i] && !prime[A[cur-1]+i]){ A[cur] = i; vis[i] = 1; dfs(cur+1); vis[i] = 0; } } } return; } int main() { memset(prime,0,sizeof(prime)); prime[0] = prime[1] = 1; for(int i = 2; i < maxn; i++){ if(!prime[i]) for(int j = 2; i*j < maxn; j++){ prime[i*j] = 1; } } int cas = 1; while(~scanf("%d",&n)){ memset(vis,0,sizeof(vis)); if(cas != 1) printf("\n"); printf("Case %d:\n",cas++); memset(A,0,sizeof(A)); vis[1] = A[0] = 1; dfs(1); } return 0; }
转载请注明原文地址: https://www.6miu.com/read-2485.html

最新回复(0)