Prime Ring Problem UVA

来源:互联网 发布:java将xml转换成json 编辑:程序博客网 时间:2024/06/06 16:27

查找素数环,题目不难,按照递归的方法解决,每次递归地填充一个位置,在判断能用哪个数填充的时候首先判断该数是否使用过了,再判断该数与上一个已经填充的数的和是否为素数,同时,在每次全部填充结束后要判断最后一个数是否与1(也就是第一个位置的数)之和为素数。具体实现见下面的源代码:

#include<iostream>#include<vector>#include<string>#include<set>#include<stack>#include<queue>#include<map>#include<algorithm>#include<cmath>#include<iomanip>#include<cstring>#include<sstream>#include<cstdio>#include<deque>using namespace std;int n;bool isPrime(int data){for (int i = 2; i*i <= data; i++){if (data%i == 0) return false;}return true;}void putElem(vector<int>& arr,int cur){if (cur == arr.size()){if (!isPrime(arr[0]+arr[arr.size()-1])) return;for (int i = 0; i < arr.size();i++){cout << arr[i];if (i != arr.size()-1) cout << " ";}cout <<endl;return;}for (int elem = 2; elem <= n; elem++){bool exist = true;for (int i = 0; i < cur; i++){if (arr[i] == elem){exist = false;break;}}if (exist&&!isPrime(arr[cur-1]+elem)) exist = false;if (exist){arr[cur] = elem;putElem(arr,cur+1);}}}int main(){int Case = 0;while (cin >> n){if (Case) cout << endl;Case++;vector<int> arr(n);arr[0] = 1;cout << "Case " << Case << ":\n";putElem(arr, 1);}return 0;}