dfs-Uva524素数环题解(dfs、输出格式、筛素数)

题目链接

题目戳这里

基本思想

深度优先搜索结合回溯思想,这是很经典的样板题。
值得注意的是,这道题在输出格式上需要细心,还有筛素数可以用打表方式,此处筛素法用的是著名的Eratosthenes筛法(经典模板)。

#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std;
int n;
const int maxn=105;
int a[25];
int p[25];
int table[maxn];
void dfs(int cur){
	for(int i=1;i<=n;i++){
		if(!table[a[cur-1]+i] && !p[i]){
			p[i]=1;
			a[cur]=i;
			if(cur==n){
				if(!table[a[cur]+a[1]]){
					if(a[1]==1){
					  for(int k=1;k<=n;k++){
						  cout<<a[k];
						  if(k!=n) cout<<' ';
						}
					  cout<<endl;
					}
				}
			}
			else dfs(cur+1);
			p[i]=0;
		}
	}
}
int main(){
	
	freopen("in.txt","r",stdin);
	freopen("out.txt","w",stdout);
	
	int m=sqrt(maxn+0.5);
	memset(table,0,sizeof(table));
	for(int i=2;i<=m;i++)
	  if(!table[i])
	    for(int j=i*i;j<=maxn;j+=i) table[j]=1;
	int t=0;
	while(cin>>n){
    if(t) cout<<endl;                        //注意这里的换行写在了输出数据的前面,为了避免最后多换一行 
		cout<<"Case "<<++t<<':'<<endl;
		dfs(1);
  }
	
	return 0;
}

作者

Bowen
本文作者水平有限,若有纰漏之处,敬请斧正。
欢迎大家一起学习交流。

发布了50 篇原创文章 · 获赞 7 · 访问量 1152

猜你喜欢

转载自blog.csdn.net/numb_ac/article/details/103102761
今日推荐