DFS一直寫不好啊啊啊

n個數字裏必須有連續m個數的和爲質數
例如(12,1)就必須由12個質數組成
n<=12,m<=4

#include <cstdio>
#include <cmath>
#include <iostream>
#include <cstring>
#include <algorithm>
#include <queue>
using namespace std;
int ans[30][30],res,n,m;
int prime[13]={2,3,5,7,11,13,17,19,23,29,31,1000};
int tem[15];
int pos[40];
void init()
{
    for(int i=0,j=0;i<=36;i++)
    {
        while(i>prime[j]) j++;
        pos[i]=j;//和爲i的值在prime數組裏佔的位置
    }
}
void dfs(int cur,int sum)
{
    if(cur==n)
    {
        res++;
        return ;
    }
    if(cur<m-1)
        for(int i=0;i<10;i++)
        {
            tem[cur+1]=i;
            dfs(cur+1,sum+i);
        }
    else
        for(int i=pos[sum];prime[i]<=sum+9;i++)//找出每一個能組成質數的下一個數
        {
            tem[cur+1]=prime[i]-sum;
            dfs(cur+1,prime[i]-tem[cur-m+2]);//刪去前一個數,使總和一直保持在m-1個數的和
        }
}
int main()
{
#ifdef LOCAL
    freopen("in.txt","r",stdin);
#endif
    init();
    for(n=1;n<=12;n++)
        for(m=1;m<=min(n,4);m++)
        {
            res=0;
            dfs(0,0);
            ans[n][m]=res;
        }
    int T;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d%d",&n,&m);
        cout<<ans[n][m]<<endl;
    }
    return 0;
}

這代碼是參考某大腿隊友寫的…我還是太弱了….

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