dfs
dfs(深度优先搜索)即从每一个位置开始,逐步搜索下一个可行解,直到找到答案或者因不合法而返回
常见应用
走迷宫问题(小规模)
可以通过暴力+剪枝解决的问题
eg.素数环问题
// 素数环问题 clockwise||anticlockwise 直接搜索 
//二维数组不宜用回溯,因为回溯时部分元素会被置为0 
#include<cstdio>
#include<cstring>
#include<cmath>
#include<ctime>
using namespace std;
int a[22];
bool vis[22];
int n;
int count;
bool isprime(int n){
	if(n==1) return 0;
	if(n==2||n==3) return 1;
	for(int i=2;i<=sqrt(n);i++){
		if(n%i==0) return 0;
	}
	return 1;
}
void dfs(int now,int cnt){     //两个变量:当前要填的数和填了多少个数 
	if(!vis[now]){
		if(isprime(now+a[cnt])){
			vis[now]=1;
			a[cnt+1]=now;
			if(cnt+1==n){
				if(isprime(a[1]+a[n])){
					for(int i=1;i<=n;i++){
						if(i<n) printf("%d ",a[i]);
						else printf("%d\n",a[i]);
					}
				}
//				return;
			}
			for(int i=2;i<=n;i++){
				if(!vis[i]) dfs(i,cnt+1);
			}
			vis[now]=0;
			a[cnt+1]=0;
		}
	}
	else{
		for(int i=2;i<=n;i++){
			if(!vis[i]){
				dfs(i,cnt);
			}
		}
	}
}
int main(){
//	freopen("data.in.txt","r",stdin);   //.txt是文件拓展名 必须写 
//	freopen("data.out.txt","w",stdout);
	while(scanf("%d",&n)==1){
		count++;
		printf("Case %d:\n",count);
		memset(a,0,sizeof(a));
		memset(vis,0,sizeof(vis));
		a[1]=1;vis[1]=1;
		for(int i=2;i<=n;i++) dfs(i,1);
//		printf("Time used = %.2f\n",(double)clock()/CLOCKS_PER_SEC);
		puts("");
	}
	return 0;
} 
 
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号