感觉这种问题,工作量都很大,其实就是一个简答的回朔问题,首先定义素数集和,定义每个元素的备选元素,然后用dfs搜索,然后回朔求解
#include <iostream>
#include <string>
#include <vector>
#include <iterator>
#include <map>
#include <cmath>
#include <vector>
#include <stack>
#include <queue>
#include <set>
using namespace std;
map<int, vector<int>> gainMap(int n, vector<int>& prime) {
map<int, vector<int>> result;
for (int i = 1; i <= n; i++)
{
vector<int> temp;
// find [i+1,i+n] prime
for (int j = 0; j < prime.size(); j++)
{
if (prime[j] > i + n)
break;
if (prime[j] >= i + 1)
temp.push_back(prime[j] - i);
}
result[i] = temp;
}
return result;
}
void process(int n, map<int, vector<int>>& maps, vector<int>& visit, vector<vector<int>>& result, vector<int>& temp, set<int>& prime2) {
if (temp.size() == visit.size()-1) {
int last = temp[temp.size() - 1];
if (prime2.find(1 + last) != prime2.end())
result.push_back(temp);
return;
}
vector<int> choice = maps[n];
for (int i = 0; i < choice.size(); i++) {
if (visit[choice[i]] == 0) {
visit[choice[i]] = 1;
temp.push_back(choice[i]);
process(choice[i], maps, visit, result, temp, prime2);
visit[choice[i]] = 0;
temp.pop_back();
}
}
}
int main() {
int n;
int caseIndex = 1;
vector<int> prime;
prime.push_back(2);
prime.push_back(3);
prime.push_back(5);
prime.push_back(7);
prime.push_back(11);
prime.push_back(13);
prime.push_back(17);
prime.push_back(19);
prime.push_back(23);
prime.push_back(27);
prime.push_back(31);
prime.push_back(37);
prime.push_back(41);
set<int> prime2;
prime2.insert(2);
prime2.insert(3);
prime2.insert(5);
prime2.insert(7);
prime2.insert(11);
prime2.insert(13);
prime2.insert(17);
prime2.insert(19);
prime2.insert(23);
prime2.insert(27);
prime2.insert(31);
prime2.insert(37);
prime2.insert(41);
while (cin >> n)
{
map<int, vector<int>> maps = gainMap(n, prime);
vector<int> visit(n + 1, 0);
vector<vector<int>> result;
vector<int> temp;
visit[1] = 1;
temp.push_back(1);
process(1, maps, visit, result, temp, prime2);
cout << "Case " << caseIndex << ":" << endl;
for (int i = 0; i < result.size(); i++) {
for (int j = 0; j < result[i].size()-1; j++)
cout << result[i][j] << " ";
cout << result[i][result[i].size() - 1]<<endl;
}
caseIndex++;
cout << endl;
}
return 1;
}