简单的回溯的应用。
代码:
#include <iostream>
#include <cstring>
#include <cmath>
using namespace std;
int data[50], vis[50], n;
int is_pre[50];
void dfs(int x)
{
if(x == n && is_pre[data[0] + data[n - 1]])
{
cout << data[0];
for(int i = 1; i < n; i++)
cout << " " << data[i];
cout << endl;
}
else for(int i = 1; i <= n; i++)
{
if(!vis[i] && is_pre[i + data[x - 1]])
{
data[x] = i;
vis[i] = 1;
dfs(x + 1);
vis[i] = 0;
}
}
}
int main()
{
// freopen("1.txt", "r", stdin);
// freopen("2.txt", "w", stdout);
int t = 0, i;
for(i = 2; i <= 50; i++)
is_pre[i] = 1;
for(i = 2; i <= 50; i++)
for(int j = i + i; j + i <= 50; j += i)
is_pre[j] = 0;
while(cin >> n)
{
if(t)
cout << endl;
data[0] = 1;
// memset(vis, 0, sizeof(vis));
vis[1] = 1;
cout << "Case " << ++t << ":" << endl;
dfs(1);
}
return 0;
}