素环问题
一个环由n个圆组成,如图所示。将自然数1,2,…,n分别放入每个圆中,相邻两个圆中的数之和应为素数。
注:第一圈的数字应始终为1。
输入
n(0<n<20)。
输出
输出格式如下所示。每一行都表示环中从1顺时针和逆时针开始的一系列圈数。数字的顺序必须满足上述要求。按词典顺序打印解决方案。
你要写一个程序来完成上述过程。
在每个案例后打印一个空行。
样本输入
6
8
样本输出
案例1:
1 4 3 2 5 6
1 6 5 2 3 4
案例2:
1 2 3 8 5 6 7 4
1 2 5 8 3 4 7 6
1 4 7 6 5 8 3 2
1 6 7 4 3 8 5 2
问题本身不难,但是细节比较多,想代码简洁且正确还是需要深厚的功底。
以下是本人ac代码:(本人也是借鉴了其他人的代码,勿喷)
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
const int N=25;
int a,n[N];
bool f[N];
int sx(int a) {
for(int i=2; i<=sqrt(a); i++ ) //记住sqrt是要加到等的
if(a%i==0)
return 0;
return 1; //可直接返回
}
void dfs(int l) {
if(l==a && sx(n[0]+n[a-1])) { //直接判断
printf("%d",n[0]); //格式要求
for(int i=1; i<a; i++)
printf(" %d",n[i]);
puts(""); //细节回车
}
for(int i=2; i<=a; i++) {
if((!f[i])&&sx(i+n[l-1])) {
n[l]=i;
f[i]=true;
dfs(l+1); //l+1可回溯成l
f[i]=false;
}
}
}
int main() {
int kase=1;
while(scanf("%d",&a)!=EOF)
{
printf("Case %d:\n",kase++);
memset(f,false,sizeof(f));
n[0]=1;
dfs(1);
printf("\n");
}
return 0;
}
这是题目 欢迎指教。
题解:
一个一个来,和线段相同,直到判断符合条件输出即可。