1020 Prime Ring Problem

本文介绍了一种解决素数环问题的方法,通过深度优先搜索(DFS)算法寻找1到N的所有排列组合,使得每两个相邻数之和为素数,并提供了一个具体的C++实现示例。

1020 Prime Ring Problem

题意:素数环,给出一个数N(0<N<20),在1~N的所有排列中,满足相邻两个数之和是素数(头尾相邻)的排列输出。

思路:1为第一个数,然后对其余的n-1个数搜索,直到最后一个数,最后把1和最后一个数进行判断,满足要求则输出。

感想:深搜,在这里把1到20,任意两个数的和中,为素数的初始化了,判断方便了许多。

#include<iostream>

#include<stdio.h>

using namespace std;

int g[42],a[21],b[21],n; //g[i]=1则i是素数,a保存成立的数列

//b[i]=0则已经在序列中,否则没有被使用

void dfs(int k,int m){

   a[k]=m;

   if(k==n){

       if(g[1+m]==0) return ;

       cout<<a[1];

       for(int i=2;i<=n;i++)

           cout<<" "<<a[i];

       cout<<endl;

       return ;

    }

   for(int i=2;i<=n;i++)

   if(b[i]&&g[i+m]){

       b[i]=0;

       dfs(k+1,i);

       b[i]=1;

    }

}

int main(){

   int i,j,k=1;

   for(i=0;i<42;i++)

 g[i]=0;

g[2]=g[3]=g[5]=g[7]=g[11]=g[13]=g[17]=g[19]=g[23]=g[29]=g[31]=g[37]=g[41]=1;

   while(cin>>n){

       for(i=0;i<=n;i++)

           b[i]=1;

       cout<<"Case"<<k++<<":"<<endl;

       dfs(1,1);

       cout<<endl;

    }

   return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值