题目传送
代码:
#include <iostream>
#include <algorithm>
#include <cstring>
#include <vector>
typedef long long ll;
using namespace std;
int n,cnt=0,a[20]={1}; //a数组记录环,第一个数是1
bool vis[20]={false}; //标记是否取过 bool is(int x) //判断素数
{if(x<2) return 0;for(int i=2;i*i<=x;i++)if(x%i==0) return 0;return 1;
}void dfs(int num)
{ if(num==n) //已找到n个数 {if(is(1+a[n-1])) //第一个数和最后一个数之和也要是素数 {printf("%d",a[0]);for(int i=1;i<n;i++) printf(" %d",a[i]); //输出 printf("\n");}return;}for(int i=2;i<=n;i++){if(!vis[i] && is(a[num-1]+i)) //没访问过,与上一个数之和为素数 {a[num]=i;vis[i]=1;dfs(num+1);vis[i]=0; //回溯 取出数 a[num]=0; //这步应该无所谓(可省) }}
}int main()
{ while(cin>>n){if(cnt) printf("\n");printf("Case %d:\n",++cnt);dfs(1); //数组0已经放了1,从数组下标1开始dfs }return 0;
}
这无语的格式错误