素数环问题

来源:互联网 发布:网络教育专升本有用吗 编辑:程序博客网 时间:2024/05/16 07:39

素数环问题

  • 题目来源:
    题目1459:Prime ring problem

#include <stdio.h>#include <map>#include <vector>using namespace std;int num=1;bool isprime(int n){  //判断数n是不是素数    if (n<2) {        //若n小于2,则不是素数        return false;    }    else{        for (int i=2; i*i<=n; i++) {  //从最小素数2,遍历至n的平方根,判断是否为素数            if(n%i==0) return false;        }        return true;    }}void solve(vector<vector<int> >& res, vector<int> &ans, int n, map<int, int> &M){    if (ans.size()==n&&isprime(ans[0]+ans[n-1])) {  //ans长度达到数组长度,且最后一个数和第一个数相加是素数,则找到一个符合的ans        res.push_back(ans);        return;    }    else{        if (ans.size()==0) {      //题目要求第一个数是1             ans.push_back(1);             M[1]--;        }        for (map<int, int>::iterator it=M.begin(); it!=M.end(); it++) {            if (it->second==0||!isprime(it->first+ans[ans.size()-1])) {  //如果与前一个数相加不是素数,活着该数已经添加到ans中,则跳过                continue;            }            else {     //如果该数与前一个数相加为素数,且没添加到ans,则添加到ans;然后再递归寻找下一个数。                ans.push_back(it->first);                it->second--;                solve(res, ans, n, M);                it->second++;                ans.pop_back();            }        }    }}int main(int argc, const char * argv[]) {//    freopen("/Users/aaa/input.txt", "r", stdin);//    freopen("/Users/aaa/out.txt", "w", stdout);    int n;    while (scanf("%d", &n)!=EOF) {        vector<int> ans;  //存储单个合理解        vector<vector<int> >res;  //存储所有解的集合        map<int, int> M;  //定义map用于记录哪些数字已经被用过        M.clear();        for (int i=1; i<=n; i++) {            M[i]++;        }        solve(res, ans, n, M);   //解答        printf("Case %d:\n", num++);  //按照格式输出解        for (int i=0; i<res.size(); i++) {            int flag=1;            for (int j=0; j<res[0].size(); j++) {                if(flag){                    printf("%d", res[i][j]);                    flag = 0;                }                else                    printf(" %d", res[i][j]);            }            printf("\n");        }        printf("\n");    }    return 0;}
0 0
原创粉丝点击