素数环,DFS历遍
题目大意为:输入一个数N(0<N<20),让1到N围成环,并且相连的两个数的和是素数,第一个数总是1 。
测试数据:
Input : N = 6
当N = 6 时的图解
Output :
Case 1:
1 4 3 2 5 6
1 6 5 2 3 4
AC代码:
#include <stdio.h>
#include <string.h>
#include <math.h>
int A[25],cur,vis[25],n;
// 打素数表,方便使用
int primelist[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};
void dfs(int cur)
{
int i;
if(cur==n && primelist[A[0]+A[n-1]]) //递归边界,切记测试第一个和最后一个数据
{
printf("%d",A[0]);
for(i=1;i<n;i++)
printf(" %d",A[i]); //这题的输出格式是最后一个没有空格直接换行
printf("\n"); //最后一组结束时没有换行
}
else
{
for(i=2;i<=n;i++)
{
if(!vis[i] && primelist[i+A[cur-1]]) //如果第i项没有使用过,并且与前一项之和为素数
{
A[cur] = i; //记录下来
vis[i] = 1; //标记使用
dfs(cur+1); //递归下一项
vis[i] = 0; //取消标记
}
}
}
}
int main()
{
int i,t=1;
A[0] = 1; //第一项总是1,题目规定
while(scanf("%d",&n)!=EOF)
{
memset(vis,0,sizeof(vis));
printf("Case %d:\n",t++);
dfs(1);
printf("\n");
}
return 0;
}