程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> HDU 1016 Prime Ring Problem

HDU 1016 Prime Ring Problem

編輯:C++入門知識

HDU 1016 Prime Ring Problem


這題我用的是DFS。不多說,看代碼和注釋。

#include
#include
#include
#include
#include
using namespace std;
//因為n<20,所以最大的素數也就是40左右,因此用一個數組來記錄45以內的素數,用於之後的判定。
bool isprime[45]={0,1,1,1,0,1,0,1,0,0,0,1,0,1,0,0,0,1,0,1,0,0,0,1,0,0,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,1,0,1,0};
int n;
bool visited[24];//用於標記是否被訪問過
void dfs(int cnt,int id,int ans[])
{
    if(cnt==n+1)
    {
        printf("%d",ans[1]);
        for(int i=2;i<=n;i++)
            printf(" %d",ans[i]);
        printf("\n");
        return;
    }
    for(int i=2;i<=n;i++)
    {
        if(visited[i]||i==id)
            continue;
        visited[i]=true;
        if(cnt==n)//這裡注意要區分是不是到達第n個數,如果到達因為是圓環,所以還要判定和1相加是不是素數。
        {
            int t1=ans[cnt-1]+i;
            int t2=i+1;
            if(isprime[t1]&&isprime[t2])
            {
                ans[cnt]=i;
                dfs(cnt+1,i,ans);
            }
        }
        else//否則就判斷和前一個數相加是不是素數
        {
            int t=ans[cnt-1]+i;
            if(isprime[t])
            {
                ans[cnt]=i;
                dfs(cnt+1,i,ans);
            }
        }
        visited[i]=false;//記得恢復
    }
}
int main()
{
    int k=1;
    while(scanf("%d",&n)!=EOF)
    {
        int ans[25];
        ans[1]=1;
        memset(visited,false,sizeof(visited));
        visited[1]=true;
        printf("Case %d:\n",k++);
        dfs(2,1,ans);
        printf("\n");
    }
    return 0;
}


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved