【codevs1031 質數環】回溯法

#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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章