深搜直接过掉。一开始Case:%d这样写的,WA了好几次,郁闷死啦。不过这题的测试数据应该是有点水。
代码吧:
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> using namespace std; #define MAX 40 int n; int visited[MAX]; int arr[MAX]; int check(int x) { for(int i = 2; i <= sqrt(x); i++) { if(x % i == 0) return 0; } return 1; } void DFS(int cur, int index) { int i; arr[cur] = index; visited[index] = 1; if(cur == n) { if(check(arr[cur] + arr[1])) { printf("1"); for(i = 2; i <= n; i++) printf(" %d", arr[i]); printf("\n"); } return; } for(i = 2; i <= n; i++) { if(!visited[i] && check(arr[cur] + i)) { DFS(cur + 1, i); visited[i] = 0; } } } int main() { int flag = 1; while(cin >> n) { printf("Case %d:\n", flag++); memset(visited, 0, sizeof(visited)); DFS(1, 1); printf("\n"); } return 0; }