我说一下我的思路
首先,穷举法实在是太费代码,要尽量简化
于是我使用的是深度优先搜索(DFS),于是就有了下面这段代码
[C/C++ code]
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
int tot = 0;//素数环计数器,初值为0
int v[50];//判断数字是否使用过的数组,1为使用过,0为未使用过
int lj[50];//路径数组
bool pd(int k){//判断是否为素数的子程序
for (int i = 2; i <=sqrt(k); i++){
if (k%i==0){
return false;
}
}
return true;
}
void pt();//声明输出函数
//==========核心代码DFS==========//
void dfs(int x){
for (int i = 1; i <= 20; i++){
if (pd(lj[x-1]+i)==1 && v[i]==0 || (x==1)){
lj[x] = i;
v[i] = 1;
if (x==20){
if (pd(lj[20] + lj[1])==1){
pt();
}
}
else{
dfs(x+ 1);
}
v[i] = 0;
}
}
}
void pt(){
for (int i = 1; i <= 20; i++){
printf("%d ", lj[i]);
}
tot++;
printf("\n");
}
int main(){
memset(v,0,sizeof(v));
dfs(1);
system("pause");
return 0;
}
反正这题只能省速度,不能省情况
[FreeBASIC code]
Dim Shared v(50) As Integer
dim Shared lj(50) As Integer
Dim Shared tot As Integer = 0
Declare Sub pt()
function pd(ByVal k As Integer) As Integer
Dim i As Integer
For i = 2 To Sqr(k)
If k Mod i = 0 Then
Return 0
End If
Next i
Return 1
End Function
Sub dfs(ByVal x As Integer)
Dim i As Integer
For i = 1 To 20
if pd(lj(x-1)+i)=1 or x=1 Then
If v(i)=0 Then
lj(x) = i
v(i) = 1
If x=20 Then
If pd(lj(20) + lj(1))=1 Then
pt()
End If
Else
dfs(x+1)
End If
v(i) = 0
EndIf
End If
Next i
End Sub
Sub pt()
Dim i As Integer
for i = 1 to 20
Print lj(i)
Next i
tot=tot+1
Sleep
End Sub
Sub main()
Dim i As Integer
For i = 0 To 50
v(i)=0
Next i
dfs(1)
Print tot
Sleep
End Sub
main()
End
//==========
@qiaozhanrong