当前位置: 代码迷 >> 综合 >> HDU - 1016 Prime Ring Problem
  详细解决方案

HDU - 1016 Prime Ring Problem

热度:29   发布时间:2023-12-08 08:18:34.0

#include <iostream>
#include <cstring>using namespace std;int arr[25],vis[25],n,cnt;//根据题意,0<n<20,所以开个大小为25的数组即可。bool is_Prime(int x)//判断数x是不是质数
{int k=0;for(int i=2; i<x; i++){if(x%i==0){k++;}}if(k==0){return true;}else{return false;}
}void dfs(int x)
{if(x==n)//如果dfs遍历到第n个数,接着进行判断{if(is_Prime(arr[1]+arr[n]))//如果第1个数和第n个数相加也为质数,那么就构成了一个素数环{for(int i=1; i<n; i++){cout << arr[i] << " ";}cout << arr[n]<< endl;//为什么这样写,避免因为最后一个数字空格+换行,OJ会出现Presentation Error的结果}}else{for(int i=2; i<=n; i++){if(is_Prime(arr[x]+i)&&!vis[i])//判断上一个确定的数和数i能否构成素数,并且i不在已经确定的数里面{arr[x+1]=i;//若满足条件,把数i放到已经确定的数里面vis[i]=1;//标记数i(保证不会出现重复的数)dfs(x+1);//进行素数环中下一个数进行判断,不断进行判断,如果不满足条件或者已经for循环完,那么return到下一步。vis[i]=0;//return之后,表明这个数不满足条件,则该数可以使用}}}}
int main()
{while(cin >> n){cnt++;cout << "Case " << cnt << ":" << endl;memset(arr,0,sizeof arr);//记得一定一定要重置数组!memset(vis,0,sizeof vis);arr[1]=1,vis[1]=1;dfs(1);cout << endl;}return 0;
}

 

 

  相关解决方案