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

hdu-1016 Prime Ring Problem(dfs)

热度:8   发布时间:2023-11-23 02:11:36.0

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1016

题目大意:一个有n个元素的环,元素分别为1-n ,要求环的首位元素为 1 且相邻的元素相加为素数,输出所有满足条件的环

题解: 用Int数组储存环,dfs两参数s表示当前要存的值的位置,num表示要存的值。dfs函数先判断与num与ans[s-1]相加的值是否为素数,如果当前要存的是最后一个值则还要判断当前值与ans[1]相加是否为素数,如果是则满足题意,输出数组。如果num与ans[s-1]相加的值不为素数,则直接返回,不进行下一步搜索。是素数,则对所有还没有使用的数进行递归调用。用visit数组表示数字被调用的情况。

AC代码:

#include <iostream>
#include"math.h"
#include"algorithm"
using namespace std;
int ans[25];
bool visit[25];
int n;
bool isPrime(int a){for(int i = 2;i<=sqrt(a);i++){if(a%i == 0)    return false; }return true;
}
void dfs(int s,int num){if(!isPrime(ans[s-1] + num))    return;if(s == n ){if(isPrime(num+1)){for(int i = 1;i<n;i++)cout<<ans[i]<<" ";cout<<num<<endl;}else    return;}if(!isPrime(ans[s-1] + num))    return;ans[s] = num;visit[num] = true;for(int i = 2;i<=n;i++){if(!visit[i]){dfs(s+1,i);visit[i] = false;}}
}int main(int argc, char** argv) {int Case = 1;while(scanf("%d",&n)!=EOF){printf("Case %d:\n",Case);ans[1] = 1;for(int i = 1;i<=n;i++)    visit[i] = false;visit[1] = true;for(int i = 2;i<=n;i++){dfs(2,i);visit[i] = false;}Case++;cout<<endl;}return 0;
}

小结:dfs题中比较简单的题

  相关解决方案