Prime Ring Problem UVA - 524

xiaoxiao2021-02-28  93

查找素数环,题目不难,按照递归的方法解决,每次递归地填充一个位置,在判断能用哪个数填充的时候首先判断该数是否使用过了,再判断该数与上一个已经填充的数的和是否为素数,同时,在每次全部填充结束后要判断最后一个数是否与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; }

转载请注明原文地址: https://www.6miu.com/read-23668.html

最新回复(0)