没什么状态,来写写博客吧
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1016
题目大意:1到n个数,相邻的任意两个数之和为素数。由于相邻的两个数之和必须为素数,有且仅有可能有一个环的存在,那么只需要找到以1为第一个元素的所有可能排列就行了。
代码:
#include<bits/stdc++.h> const int maxn=20; int vis[maxn],num[maxn],n,count_1=1; using namespace std; bool re(int a,int b){ int sum=a+b; int i; for(i=2;i<=sqrt(sum);i++){//判断是否为素数 if(sum%i==0) return false; } return true; } void dfs(int cur){ if(!re(num[cur],num[cur-1])) //若不为素数,返回; return; if(cur==n){//一组排列找到之后,输出然后返回; int i; if(num[1]==1&&re(num[cur],num[1])){ for(i=1;i<=n;i++) cout<<num[i]<<' '; cout<<endl;} return; } int i; for(i=1;i<=n;i++){ if(!vis[i]){ vis[i]=1; num[cur+1]=i;//进行排列 dfs(cur+1); vis[i]=0; } } } int main() { while(cin>>n){ cout<<"Case "<<count_1<<':'<<endl; memset(vis,0,sizeof(vis)); memset(num,0,sizeof(num)); dfs(0); count_1++; } }