题目链接:http://acm.hdu.edu.cn/status.php?user=hqucst&pid=1016&status=5
题目分析:把n个数排成一圈,然后两两相加为素数。由于需要把所有的情况都找出来,所以这里用递归来做,把所有情况遍历一遍。递归的思想还需要好好领悟。我记得上学期有一段时间研究了一阵,有那么一点点感觉,但不是很深刻。
whatever,今天解决了一个困扰我很久的问题,因为我在提交这道题的时候,出现了格式错误,单词不记得了。反正我搞了很久,总算解决了,窃喜ing.......
#include<iostream>
#include<string.h>
using namespace std;
#define M 42
bool prime[M];
int a[22];
int used[22];
void Prime()
{
memset(prime,1,sizeof(prime));
int i,j;
for(i = 2; i < 7; ++i)//外层循环到n的平方根就可以了
{
for(j = 2; j * i <= 40; ++j)
{
prime[j*i] = 0;
}
}
}
void DFS(int num, int n)
{
if(num >= n && prime[a[n] + a[1]])
{
for(int i = 1; i < n; ++i)
{
printf("%d ",a[i]);
}
printf("%d\n", a[n]);
return;
}
for(int i = 2; i <= n; ++i)//遍历所有数据,用used标记该数到底有没有使用
{
if(!used[i] && prime[a[num] + i])//考察第num+1个符合情况的数
{
a[num + 1] = i;
used[i] = 1;
DFS(num + 1, n);
used[i] = 0;
}
}
}
void main()
{
int n;
int t;
a[1] = 1;
t = 1;
Prime();
while(scanf("%d",&n) != EOF)
{
printf("Case %d:\n", t++);
if((n&1) == 0)
{
memset(used,0,sizeof(used));
DFS(1, n);//从1开始
}
printf("\n");
}
}