UVa

来源:互联网 发布:子域名 二级域名 编辑:程序博客网 时间:2024/06/03 14:45

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;}
0 0
原创粉丝点击