原题链接:
http://acm.hdu.edu.cn/showproblem.php?pid=1016
感悟:
这题一看就是递归+深搜+回溯,本来的写的代码已经可以输出正确答案,但是大部分判断都是循环,怕过不了,结合其他一些博主的代码,优化了一下。特别是用flag表示是否数组这一招比较佩服,用内存换时间,本来还是列素数表,循环判断会多用很多时间。
对于回溯了解的还不是很多,目前看来是设置一个标识,在继续搜索之前开启一下,再在返回的时候取消
格式问题:每行后面不能留空,是每行之后空一行,不是两行间空一行。
c++代码:
#include<iostream>
#include<cmath>
#include<cstring>
using namespace std;
int prime[38]={0, 0, 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,};
int line[25];
int vis[25];
int n;
bool isSu(int a);
void ss(int x);
int main(){
int time=0;
while (cin >> n){
memset(line, 0, sizeof(line));
memset(vis,0,sizeof(vis));
line[0] = 1;
vis[1]=1;
cout << "Case " << ++time << ":" << endl;
if(n%2==1){
cout << endl;
continue;
}
ss(1);
cout << endl;
}
return 0;
}
bool isSu(int a){
if(prime[a]){
return true;
}
return false;
}
void ss(int x){
if (x == n&& isSu(line[x - 1] + line[0]) ){
for (int i = 0; i < n; i++){
cout << line[i];
if(i!=n-1){
cout<<" ";
}
}
cout << endl;
}
else{
for (int i = 2; i <= n; i++){
if (!vis[i] && isSu(i+line[x-1])){
line[x] = i;
vis[i]=1;
ss(x + 1);
vis[i]=0;
}
}
}
}