题意:求排列(一个环),要求每两个相邻的数的和都是素数(头尾也要是素数),并按顺时针和逆时针输出所得结果。
深搜。
#include<stdio.h>
#include<string.h>
int is_prime[40] = {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}; //数据最大二十, 查到 20+19 即可。
int vis[23], ans[23];
int n;
int dfs(int pre, int post, int num){
if(!is_prime[pre+post]){
return 0;
}
ans[num] = post;
// printf("%d\n",num);
if(num == n && is_prime[post + 1]){
for(int i = 1; i < n; i++)
printf("%d ",ans[i]);
printf("%d\n",ans[n]);
return 1;
}
vis[post] = 1;
for(int i = 2; i <= n; i++)
if(!vis[i] && dfs(post, i, num + 1)) break;
vis[post] = 0;
return 0;
}
int main(){
int t = 1;
while(~scanf("%d", &n)){
memset(vis, 0, sizeof(vis));
printf("Case %d:\n", t++);
ans[1] = 1;
if(n == 1)
printf("1");
else
for(int i = 2; i <= n; i++)
dfs(1,i,2);
printf("\n");
}
return 0;
}