【codevs1031 质数环】回溯法

来源:互联网 发布:虚拟机与主机网络连接 编辑:程序博客网 时间:2024/05/10 06:48
#include <cstdio>#include <cmath>#include <cstring>int A[50], n;bool vis[50], isp[50];bool is_prime(int i){    if (i == 2)    {        return true;    }    for (int j = 2; j <= (int)sqrt(i); j++)    {        //printf("%d ", j);        if ((i % j) == 0)        {            return false;        }    }    //printf("\n");    return true;}void dfs(int cur){    A[0] = 1;    if (cur == n && isp[A[0] + A[n - 1]])    {        for (int i = 0; i < n; i++) printf("%d ", A[i]);        printf("\n");    }    else for (int i = 2; i <= n; i++)    {        if (!vis[i] && isp[i + A[cur - 1]])        {            A[cur] = i;            vis[i] = true;            dfs(cur + 1);            vis[i] = false;        }    }}int main(){    scanf("%d", &n);    memset(isp, false, sizeof(isp));    for (int i = 2; i <= 2 * n; i++)    {        //printf("-%lf\n", sqrt(i));        isp[i] = is_prime(i);        // if (isp[i] == true)        // {        //     printf("%d\n", i);        // }    }    memset(vis, false, sizeof(vis));    dfs(1);    return 0;}

WA了一上午!!!!!
一开始是判断is_prime的时候i % j == 0 写成了i / j == 0 = =蜜汁死蠢错误。

后来。。。。主函数里是dfs(1) ,是从第二个数开始搜(数组从0开始存的),因为题目上说规定数环上的第一个数字总是1!!!!!!!!你怎么又不看题!!!!!!!!!!
所以加上A[0] = 1 就。。过。。了。。。。。。qnq

0 0
原创粉丝点击