题目地址:http://codevs.cn/problem/1031/
分析:
深搜回溯
代码:
var s:set of 1..17;
a:array[1..17]of word;
n:word;
b:boolean;
procedure print;{输出}
var i:word;
begin
for i:=1 to n do
write(a[i],‘ ‘);
writeln;
end;
function pd(x:word):boolean;{判断是否素数}
var i:word;
begin
pd:=true;
for i:=2 to trunc(sqrt(x))do
if x mod i=0 then begin pd:=false; break;end;
end;
procedure search(k:word);{回溯搜索}
var i:word;
begin
a[1]:=1;{将1定为起始}
for i:=2 to n do
if (i in s)and(pd(i+a[k-1]))then begin
a[k]:=i;
s:=s-[i];
if (k=n)and(pd(i+a[1])) then print{别忘记判断第一个和最后1个}
else search(k+1);
s:=s+[i];
end;
end;
begin
readln(n);
if (n mod 2=1) then halt;{单数肯定不会有,数学想想便知}
s:=[2..n];
search(2);
end.
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文地址:http://blog.csdn.net/boyxiejunboy/article/details/46943029