杭電1016 Prime Ring Problem
阿新 • • 發佈:2019-02-15
該題目的大概意思是:給定一個正整數n,在1~n這n個數中,按一定順序組成一個圓環,要求圓環相鄰兩個數之和為素數,求出所有這樣的組合並輸出。思路:開始想到迴圈列舉判斷,現在用DFS法//Prime Ring Problem
#include <iostream>
#include<cmath>
using namespace std;
int prime[40]={ 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};//手打素數表
int n;
bool visit[25];//是否進行遍歷的標誌陣列
int a[25]; //儲存數字1~n
void dfs(int num)
{
if(num==n && prime[a[0]+a[num-1]])//遍歷所有數且相鄰數之和為素數,則符合,輸出
{
for(int i=0;i<num;i++)
{
if(i!=num-1)
cout<<a[i]<<" ";
else
cout<<a[i]<<endl;
}
}
else
{
for(int i=2;i<=n;i++)
{
if(visit[i]==0)//若有未遍歷的
{
if(prime[i+a[num-1]])//若與已遍歷的最後一個數之和為素數,符合要求
{
visit[i]=1;
a[num++]=i;//賦值
dfs(num);//遍歷該分支
visit[i]=0;//恢復,等待下次迴圈遍歷另一分支
num--;
}
}
}
}
}
int main()
{
int count=0;
while(cin>>n)
{
count++;
cout<<"Case "<<count<<":"<<endl;
a[0]=1;
dfs(1);//從根遍歷
cout<<endl;
}
return 0;
}
另外題中因為資料不多,素數表可手打,判斷時也方便,也可用下面的函式代替:2bool IsPrime(int n)
3{
4for (int i =2; i * i <= n; i++)
5if(n % i ==0)
6returnfalse ;
7returntrue ;
8}
另附大神部落格學習:http://blog.csdn.net/lishuhuakai/article/details/8014971