题目链接: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题中比较简单的题