hdu1016 质数环
题目链接:Prime Ring Problem
给定一个环和1~n,让你将其填到环上,使其相邻的数相加为质数。
思路:首先题目要求找出所有的情况并打印,dfs可以进行处理。考虑数组代替环存,最后放完n个数的时候加一个首尾和判断。使用dfs进行试探,如果满足条件继续深搜,不满足则回退。
dfs函数:
void dfs(int x) //参数的含义是填了多少个数 { a[0]=1; if(x==n&&isprime(a[0]+a[n-1])) //满足条件直接输出 { for(int i=0;i<n-1;i++) { cout<<a[i]<<" "; } cout<<a[n-1]<<endl; } else { for(int i=2;i<=n;i++) //由于首部为1,所以从2开始进行搜索,这个循环保证所有数都能用到 { if(isprime(a[x-1]+i)&&vis[i]==0) //vis表示该数字是否被用过【因为每个数字只能用一次】 { vis[i]=1; a[x]=i; dfs(x+1); //下一步搜索 vis[i]=0; } } } }
完整代码:
#include<bits/stdc++.h> using namespace std; int a[105],vis[105],n; bool isprime(int x) { for(int i=2;i*i<=x;i++) { if(x%i==0) { return 0; } } return 1; } void dfs(int x) { a[0]=1; if(x==n&&isprime(a[0]+a[n-1])) { for(int i=0;i<n-1;i++) { cout<<a[i]<<" "; } cout<<a[n-1]<<endl; } else { for(int i=2;i<=n;i++) { if(isprime(a[x-1]+i)&&vis[i]==0) { vis[i]=1; a[x]=i; dfs(x+1); vis[i]=0; } } } } int main() { int cnt=1; while(cin>>n) { cout<<"Case "<<cnt++<<":"<<endl; dfs(1); cout<<endl; } return 0; }